android view 滑动冲突解决办法

来源:互联网 发布:mac向上箭头 编辑:程序博客网 时间:2024/05/17 08:10

滑动冲突

android view 的滑动冲突 典型的就是 水平 和垂直view  之间的布局镶嵌所产生的滑动冲突。

准备

1.了解android 的事件传递;2.了解dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 三个方法的作用

解决思路

1、外部拦截法    水平A 控件(简称A) 垂直B 控件(简称B) A 包含 B    只拦截需要A处理的touch事件,否则放行 -> onInterceptTouchEvent2、内部拦截发    所有的事件 都发送给B  B来负责 时间的分发    B  拦截所需要的touch 事件

伪代码实现

1、外部拦截机制public boolean onInterceptTouchEvent( MotionEvent event) {     boolean intercepted = false;    int x = (int) event. getX();     int y = (int) event. getY();     switch (event. 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; 

}

2、内部拦截机制

    public boolean dispatchTouchEvent(MotionEvent event) {        int x = (int) event.getX();        int y = (int) event.getY();        switch (event.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(event);    }

多重嵌套 也可以使用这种方法,需要自己发挥