码迷,mamicode.com
首页 > 移动开发 > 详细

Android滑动事件冲突(上)

时间:2016-03-07 13:46:59      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:

首先,我们假设这样一个场景:一个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滑动事件冲突(上)

标签:

原文地址:http://www.cnblogs.com/yxx123/p/5250101.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!