高仿微信的滑动返回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) {
}