Android

Android笔记-页面右滑返回效果

参考各位大牛的博客后所总结的个人笔记。

 

实现类似微信二级菜单返回到一级菜单。

1、新建一个返回的类,继承自页面所继承的AppCompatActivity,也可以继承其他,根据需求修改。可自行修改按下的位置和滑动的距离。

  1. public class LeftToRightBack extends AppCompatActivity {  
  2.     View decorView;  
  3.     float downX, downY;  
  4.     float screenWidth, screenHeight;  
  5.    
     
  6.     boolean allow = false;  
  7.     public void InitLeftToRightBack()  
  8.     {  
  9.         // 获得decorView  
  10.         decorView = getWindow().getDecorView();  
  11.    
     
  12.         // 获得手机屏幕的宽度和高度,单位像素  
  13.         DisplayMetrics metrics = new DisplayMetrics();  
  14.         getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  15.         screenWidth = metrics.widthPixels;  
  16.         screenHeight = metrics.heightPixels;  
  17.         allow = true;  
  18.     }  
  19.     @Override  
  20.     public boolean onTouchEvent(MotionEvent event) {  
  21.         TouchEvent(event);  
  22.         return super.onTouchEvent(event);  
  23.     }  
  24.     boolean isSide = false;  
  25.     public void TouchEvent(MotionEvent event) {  
  26.         if(allow){  
  27.             if(event.getAction() == MotionEvent.ACTION_DOWN){// 当按下时  
  28.                 // 获得按下时的X坐标  
  29.                 downX = event.getX();  
  30.                 isSide = downX < screenWidth / 10;  
  31.             }else if(event.getAction() == MotionEvent.ACTION_MOVE && isSide){// 当手指滑动时  
  32.                 // 获得滑过的距离  
  33.                 float moveDistanceX = event.getX() – downX;  
  34.                 if(moveDistanceX > 0){// 如果是向右滑动  
  35.                     decorView.setX(moveDistanceX); // 设置界面的X到滑动到的位置  
  36.                 }  
  37.    
     
  38.             }else if(event.getAction() == MotionEvent.ACTION_UP && isSide){// 当抬起手指时  
  39.                 // 获得滑过的距离  
  40.                 float moveDistanceX = event.getX() – downX;  
  41.                 if(moveDistanceX > screenWidth / 3){  
  42.                     // 如果滑动的距离超过了手机屏幕的1/3, 结束当前Activity  
  43.                     finish();  
  44.                 }else// 如果滑动距离没有超过一半  
  45.                     // 恢复初始状态  
  46.                     decorView.setX(0);  
  47.                 }  
  48.             }  
  49.         }  
  50.    
     
  51.     }  
  52. }  

2、新建二级页面,继承自LeftToRightBack,主要是为了继承TouchEvent事件,然后再onCreate方法中添加初始化InitLeftToRightBack();

  1. public class ServerActionActivity extends LeftToRightBack {  
  2.    
     
  3.     //定义数据  
  4.     private List<SeverAction> mData;  
  5.     //定义ListView对象  
  6.     private ListView mListViewArray;  
  7.     private Context context;  
  8.     String innerCachePath;  
  9.    
     
  10.     @Override  
  11.     protected void onCreate(Bundle savedInstanceState) {  
  12.         super.onCreate(savedInstanceState);  
  13.    
     
  14.         setContentView(R.layout.activity_serveraction);  
  15.    
     
  16.         context = getApplicationContext();  
  17.         innerCachePath = this.getCacheDir().getAbsolutePath();  
  18.    
     
  19.         InitLeftToRightBack();  
  20.    
     
  21. }    }  

3、此时已经可以实现右滑返回,但是在滑动过程中会出现乱的页面。解决方法如下,在styles中加入透明的主题,这样在返回的时候不会出现乱的页面,而是出现上级页面。并且在AndroidManifest中引用。

Styles

  1. <style name=“MyTheme” parent=“Base.Theme.AppCompat.Light.DarkActionBar”>  
  2.     <item name=“colorPrimary”>@color/colorPrimary</item>  
  3.     <item name=“colorPrimaryDark”>@color/colorPrimaryDark</item>  
  4.     <item name=“colorAccent”>@color/colorAccent</item>  
  5.     <item name=“android:windowBackground”>@android:color/transparent</item>  
  6.     <item name=“android:colorBackgroundCacheHint”>@null</item>  
  7.     <item name=“android:windowIsTranslucent”>true</item>  
  8. </style>  

Manifest

  1. <activity  
  2.     android:name=“.ServerActionActivity”  
  3.     android:theme=“@style/MyTheme” />  

4、新的问题又来了,摆放控件后可以看到上级页面,这样不行,所以要在二级页面上面添加上背景颜色

  1. android:background=“@android:color/white”  

 

5、经过测试发现在有一个大的控件摆放在页面后右滑就没有用,Touch事件被控件消费掉了,所以要利用事件分发机制,保证页面可以正常返回。

获取控件后直接添加分发,如果还有其他控件消费了该事件,都要加上分发机制

  1. mListViewArray = findViewById(R.id.sever_action_listview);  
  2. mListViewArray.setOnTouchListener(new View.OnTouchListener() {  
  3.     @Override  
  4.     public boolean onTouch(View view, MotionEvent motionEvent) {  
  5.         TouchEvent(motionEvent);  
  6.         return false;  
  7.     }  
  8. });  

LEAVE A RESPONSE

电子邮件地址不会被公开。

Hi, I'm shaynerain, this is my website. www.shaynerain.com