读书笔记—View的滑动冲突

来源:互联网 发布:武林外传人物分析 知乎 编辑:程序博客网 时间:2024/05/17 03:04

View的滑动冲突

常见的滑动冲突常见

  • 1.外部滑动方向和内部滑动方向不一致。
  • 2.外部滑动方向和内部滑动方向一致。
  • 3.上面两种情况的嵌套

滑动冲突的解决方式

  • 1.外部拦截法

所谓外部拦截法是指点击事件都先经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要则不拦截此事件。外部拦截法需要重写父容器的onInterceptTouchEvent方法,在内部做响应的拦截即可。伪代码如下:

public boolean onInterceptTouchEvent(MotionEvent ev){    boolean intercepted=false;    int x=(int)ev.getX();    int y=(int)ev.getY();    switch(ev.getAction){        case MotionEvent.ACTION_DOWN:            intercepted=false;        break;        case MotionEvent.ACTION_MOVE:            if(父容器需要当前点击事件){                intercepted=true;            }else{                intercepted=false;            }        break;        case MotionEvent.ACTION_UP:            intercepted=false;        break;        default:        break;    }    mLastXIntercept=x;    mLastYIntercept=y;    return intercepted;}
  • 内部拦截法

内部拦截法是指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器去处理,这种方法和Android中的事件分发机制不一致,需要配合requestDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍微复杂。

public boolean dispatchTouchEvent(MotionEvent ev){    int x=(int)ev.getX();    int y=(int)ev.getY();    switch(ev.getAction){        case MotionEvent.ACTION_DOWN:            parent.requestDisallowInterceptTouchEvent(true);        break;        case MotionEvent.ACTION_MOVE:            int deltaX=x-mLastX;            int deltaY=y-mLastY;            if(父容器需要此类点击事件){                parent.requestDisallowInterceptTouchEvent(false);            }        break;        case MotionEvent.ACTION_UP:        break;        default:        break;    }    mLastX=x;    mLastY=y;    return super.dispatchTouchEvent(ev);}

在这种方法中,为什么父容器不能拦截ACTION_DOWN事件?
因为ACTION_DOWN事件不受FLAG_DISALLOW_INTERCEPT这个标记位的控制,所以一旦父容器拦截ACTION_DOWN事件,那么所有的事件都无法传递到子元素中去,这样内部拦截就无法起作用了。

0 0
原创粉丝点击