Android滑動事件沖突


首先,我們假設這樣一個場景:一個ViewPager里面嵌套一個ViewPager,內部滑動方向和外部滑動方向一樣時,該怎么解決這一沖突呢? 
針對滑動沖突這里給出兩種解決方案:外部攔截法,內部攔截法。

外部攔截法

情景:一個ViewPager嵌套了一個Listview,一個是左右滑動,一個上下滑動。這個時候我們可以用外部攔截法,來處理沖突。在父容器ViewPager中,重寫onInterceptTouchEvent()方法,判斷當左右滑動時就攔截事件,上下滑動就不攔截,將事件交由子元素Listview來處理。首先我們需要重寫一個ViewPager,叫MyViewPager,然后重寫onInterceptTouchEvent()方法。具體代碼如下:

 1 public class MyViewPager extends ViewPager {
 2     private int startX;
 3     private int startY;
 4     public MyViewPager(Context context) {
 5         super(context);
 6     }
 7 
 8 
 9     @Override
10     public boolean onInterceptTouchEvent(MotionEvent ev) {
11         switch (ev.getAction())
12         {
13             case MotionEvent.ACTION_DOWN:
14                 startX= (int) ev.getX();
15                 startY= (int) ev.getY();
16                 break;
17             case MotionEvent.ACTION_MOVE:
18 
19                 int dX= (int) (ev.getX()-startX);
20                 int dY= (int) (ev.getY()-startX);
21                 if(Math.abs(dX)>Math.abs(dY)){//左右滑動
22                     return true;
23                 }else {//上下滑動
24                     return false;
25                 }
26             case MotionEvent.ACTION_UP:
27                 break;
28         }
29         return super.onInterceptTouchEvent(ev);
30     }
31 }

這樣就解決這種情況下的滑動沖突, 程序演示入下圖: 

上述代碼是外部攔截的典型邏輯,只需要重寫onInterceptTouchEvent()方法,修改父容器當前需要的事件即可。

 

內部攔截法

情景:一個ViewPager嵌套了一個ViewPager,兩個都是左右滑動。這個時候我們可以用內部攔截法,來處理沖突。即重寫子元素的dispatchTouchEvent()方法,並調用getParent().requestDisallowInterceptTouchEvent(true)是父容器不能攔截子元素需要的事件。下面來看具體代碼:

 1 public boolean dispatchTouchEvent(MotionEvent event) {
 2         ...
 3 
 4         switch (action) {
 5             case MotionEvent.ACTION_MOVE:
 6                         getParent().requestDisallowInterceptTouchEvent(true);
 7 
 8                 break;
 9             case MotionEvent.ACTION_MOVE:
10                 if(子元素需要處理此事件)
11                             getParent().requestDisallowInterceptTouchEvent(true);
12 
13                 break;
14             case MotionEvent.ACTION_UP: {
15                 break;
16         }
17         ...
18         return super.dispatchTouchEvent(event);
19 ;
20     }

當然,還需要修改父容器的onInterceptTouchEvent()方法,代碼如下:

 1 @Override
 2     public boolean onInterceptTouchEvent(MotionEvent ev) {
 3 
 4             int action=ev.getAction();
 5             if(action==MotionEvent.ACTION_DOWN){
 6                 return false;
 7             }else {
 8                 return true;
 9             }
10         }

運行結果如圖:

以上就是兩種解決滑動沖突的解決方案。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM