仿微信滑动退出Activity

来源:互联网 发布:视频培训软件 编辑:程序博客网 时间:2024/05/18 02:50

原文链接:http://blog.csdn.net/u013045971/article/details/53900820

效果图:



原理:

        原理一句话就能描述清楚。重写Activity的dispatchTouchEvent,滑动的时候拿到Activity栈中栈顶Activity的上一个Acticity的ContentView添加到栈顶Activity的DecorView中,滑动的过程中做视图平移,滑动结束之后把前面拿过来用的ContentView归还给上一个Activity,然后finish当前Activity。

ActivityStack:

        实现 Application.ActivityLifecycleCallbacks 接口,在App的Application中注册这个栈,当App中的Activity新增或者删除时会回调接口中的方法。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public class ActivityBackStack implements Application.ActivityLifecycleCallbacks {  
  2.   
  3.     private Stack<Activity> mActivityStack;  
  4.   
  5.     public ActivityBackStack() {  
  6.         mActivityStack = new Stack<>();  
  7.     }  
  8.   
  9.     @Override  
  10.     public void onActivityCreated(Activity activity, Bundle savedInstanceState) {  
  11.         mActivityStack.add(activity);  
  12.     }  
  13.   
  14.     @Override  
  15.     public void onActivityStarted(Activity activity) {  
  16.   
  17.     }  
  18.   
  19.     @Override  
  20.     public void onActivityResumed(Activity activity) {  
  21.   
  22.     }  
  23.   
  24.     @Override  
  25.     public void onActivityPaused(Activity activity) {  
  26.   
  27.     }  
  28.   
  29.     @Override  
  30.     public void onActivityStopped(Activity activity) {  
  31.   
  32.     }  
  33.   
  34.     @Override  
  35.     public void onActivitySaveInstanceState(Activity activity, Bundle outState) {  
  36.   
  37.     }  
  38.   
  39.     @Override  
  40.     public void onActivityDestroyed(Activity activity) {  
  41.         if (activity != null) {  
  42.             mActivityStack.remove(activity);  
  43.         }  
  44.     }  
  45.   
  46.     /** 
  47.      * 获取栈顶的Activity 
  48.      * 
  49.      * @return 
  50.      */  
  51.     public Activity getLastActivity() {  
  52.         return mActivityStack.lastElement();  
  53.     }  
  54.   
  55.     /** 
  56.      * 获取倒数第二个Activity 
  57.      * 
  58.      * @return 
  59.      */  
  60.     public Activity getPreActivty() {  
  61.         int size = mActivityStack.size();  
  62.         if (size < 2) {  
  63.             return null;  
  64.         }  
  65.         return mActivityStack.get(size - 2);  
  66.     }  
  67.   
  68.     public int getSize() {  
  69.         return mActivityStack.size();  
  70.     }  
  71. }  
然后在Application中注册这个实现类

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. registerActivityLifecycleCallbacks(mBackStack);  

DecorView

        1.DecorView 为整个Window界面的最顶层View

        2.DecorView只有一个子View LinearLayout,代表整个Window界面,包括ton通知栏,标题栏,和内容区域。

        3.获取DecorView:activity.getWindow().getDecorView()

滑动:

        重写Activity的dispatchTouchEvent,设定一个阀值,在阀值内出发时拿到上一个Activity的ContentView添加到当前的DecorView中,index为0,置于最低定。滑动的过程中动态改变容器的X值,让其做出平移效果,松开手之后做取消或者关闭动画。动画结束后把前面拿到的ContentView归还。

DEMO:

        https://github.com/gumingwei/SwipeBackActivity

原文链接:

        原文链接:http://blog.csdn.net/u013045971/article/details/53900820

0 0
原创粉丝点击