高仿微信的滑动返回SwipeBackActivity

高仿微信的滑动返回SwipeBackActivity

仔细的同学可以发现,微信的滑动返回其实比一般的滑动返回要细致一点,返回的Activity会显示一部分,然后跟着联动,而以前一般的是直接两个相连的滑动。本文就讲一讲怎么高仿出一个微信的滑动返回功能。

这里写图片描述

滑动进入

如果只有滑动返回,用户是很难发现有这一功能的,但是如果新的Activity就是从屏幕的右侧向左滑动显示出来的,那么在屏幕左侧滑动能将该Activity滑出的感觉就很顺其自然,这就是一些交互方面的知识了,所以我们先要做出新Activity滑动进入的效果。

这一个效果非常好做,网上的方法基本就是一个使用 overridePendingTransition() 方法,然后使用已经编写好的项目,xml文件来加载出一个transition来,这就可以实现了。

    @Override  
    public void startActivity(Intent intent) {  
        super.startActivity(intent);  
        overridePendingTransition(R.anim.in_right, R.anim.out_left);  
    }  
R.anim.in_right.xml

    <?xml version="1.0" encoding="utf-8"?>  
    <set xmlns:android="http://schemas.android.com/apk/res/android">  
        <translate android:fromXDelta="100%p" android:toXDelta="0"  
            android:duration="@android:integer/config_shortAnimTime" />  
    </set>  
R.anim.out_left.xml

    <?xml version="1.0" encoding="utf-8"?>  
    <set xmlns:android="http://schemas.android.com/apk/res/android">  
        <translate android:fromXDelta="0" android:toXDelta="-100%p"  
            android:duration="@android:integer/config_shortAnimTime" />  
    </set>  

原理也非常简单,原Activity从屏幕的0位置移动到-100%p,-100%p就是一个屏幕的宽度,往负方向移动就是往左移动,所以就从左侧滑出了。而新Activity就从右侧100%p位置滑动到0位置,这样就从右侧滑入了。两个动画会同步进行,这样就能达到了滑动进入的效果了。

滑动返回

基本原理是:利用Application类的 registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks) 方法,可以记录全局所有Activity的生命周期,因此我们可以利用这点来储存我们所有的Activity与一个栈中,每次滑动返回时从栈中取出前一个Activity,然后分离出其中id为 Window.ID_ANDROID_CONTENT 的 FrameLayout,这个 FrameLayout 就是我们 setContentView 中的那个view的父view,利用这个 FrameLayout 就可以获取 Activity 界面显示的View。然后我们监听手势事件,在滑动的时候将前一个Activity的View加载进来并不断更改其偏移量即可。

首先是实现ActivityLifecycleCallbacks接口,并在其中用一个栈储存我们所有的Activity:

public class ActivityLifeCycleHelper implements Application.ActivityLifecycleCallbacks {
   
    private Stack<Activity> mActivities;

    public ActivityLifeCycleHelper(){
        mActivities=new Stack<>();
    }

    @Override
    public void onActivityCreated(Activity activity, Bundle bundle) {
        mActivities.add(activity);
    }

    @Override
    public void onActivityStarted(Activity activity) {
    }

    @Override
    public void onActivityResumed(Activity activity) {
    }

    
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值