Android滑动事件冲突(上)

Posted Vonnie Jade

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android滑动事件冲突(上)相关的知识,希望对你有一定的参考价值。

首先,我们假设这样一个场景:一个ViewPager里面嵌套一个ViewPager,内部滑动方向和外部滑动方向一样时,该怎么解决这一冲突呢? 
针对滑动冲突这里给出两种解决方案:外部拦截法,内部拦截法。

外部拦截法

外部拦截法是指点击事件都先经过父容器的拦截处理,如果父容器需要此拦截事件,就拦截,不需要就不拦截,这种方法比较符合点击事件的分发机制。这种方法代码如下:

 1 @Override
 2     public boolean onInterceptTouchEvent(MotionEvent ev) {
 3 
 4         ...
 5         boolean intercepted=false;
 6         switch (action) {
 7             case MotionEvent.ACTION_MOVE:
 8                 intercepted=false;
 9                 break;
10             case MotionEvent.ACTION_MOVE:
11                 if(父容器需要处理此事件)
12                     intercepted=true;
13                 else
14                     intercepted=false;
15                 break;
16             case MotionEvent.ACTION_UP: {
17                 intercepted=false18                 break;
19         }
20 
21         ...
22         return intercepted;
23     }

上述代码是外部拦截的典型逻辑,只需要重写onInterceptTouchEvent()方法,修改父容器当前需要的事件即可。

 

内部拦截法

内部拦截法是指:父容器不拦截任何事件,所有事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器处理。这种方法与Android中的事件分发机制不一致,需要配合 requestDisallowInterceptTouchEvent()方法才能正常工作。我们需要重写子元素的,代码如下:

 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         }

以上就是两种解决滑动冲突的解决方案,具体的demo演示,将在我的下一篇博客中讲解。

以上是关于Android滑动事件冲突(上)的主要内容,如果未能解决你的问题,请参考以下文章

从源码角度分析Android 事件分发机制以及常见滑动冲突解决方案

从源码角度分析Android 事件分发机制以及常见滑动冲突解决方案

Android——滑动事件冲突解决

android 内部viewpager添加点击事件之后不能滑动了

android viewpager滑动与slidingpanelayout冲突怎么解决

Android 滑动冲突以及如何解决