View的滑动冲突解决方案

View的滑动冲突

1、常见的滑动冲突场景

  外部滑动方向与内部滑动方向不一致,比如ViewPager中包含ListView
  外部滑动方向与内部滑动方向一致
  上面两种情况的嵌套

2、滑动冲突的处理规则

  可以根据滑动距离和水平方向形成的夹角;或者根绝水平和竖直方向滑动的距离差;或者两个方向上的速度差等。

3、滑动冲突的解决方式

  • 外部拦截法

  点击事件都经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要此事件就不拦截,该方法需要重写父容器的onInterceptTouchEvent方法,再内部做相应的拦截即可,伪代码如下:

 1      public boolean onInterceptTouchEvent(MotionEvent event) {
 2         boolean intercepted = false;
 3         int x = (int) event.getX();
 4         int y = (int) event.getY();
 5 
 6         switch (event.getAction()) {
 7             case MotionEvent.ACTION_DOWN: {
 8                 intercepted = false;
 9                 break;
10             }
11             case MotionEvent.ACTION_MOVE: {
12                 int deltaX = x - mLastXIntercept;
13                 int deltaY = y - mLastYIntercept;
14                 if (/*父容器需要拦截当前点击事件的条件,例如:*/Math.abs(deltaX) > Math.abs(deltaY)){
15                     intercepted = true;
16                 } else{
17                     intercepted = false;
18                 }
19                 break;
20             }
21             case MotionEvent.ACTION_UP: {
22                 intercepted = false;
23                 break;
24             }
25             default:
26                 break;
27         }
28 
29         mLastXIntercept = x;
30         mLastYIntercept = y;
31 
32         return intercepted;
33     }
  • 内部拦截法

  父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就由父容器进行处理,这种方法和Android中的事件分发机制不一样,需要配合requestDisallowInterceptTouchEvent方法才能正常工作。

  在目标view的onTouchEvent中如下:

 1     public boolean onTouch(View v, MotionEvent event) {
 2         switch (event.getAction()) {
 3             case MotionEvent.ACTION_DOWN:
 4                 viewPager.requestDisallowInterceptTouchEvent(true);
 5                 break;
 6             case MotionEvent.ACTION_MOVE:
 7                 break;
 8             case MotionEvent.ACTION_UP:
 9             case MotionEvent.ACTION_CANCEL:
10                 viewPager.requestDisallowInterceptTouchEvent(false);
11                 break;
12         }
13     }

 

posted @ 2016-09-27 10:21  f9q  阅读(259)  评论(0编辑  收藏  举报