Skip to content

Latest commit

 

History

History
67 lines (54 loc) · 1.81 KB

滑动冲突.md

File metadata and controls

67 lines (54 loc) · 1.81 KB

滑动冲突

常见的滑动冲突场景

  • 外部滑动方向和内部滑动方向不一致

  • 外部滑动方向和内部滑动方向一致

  • 以上两种情况的嵌套

外部拦截法

  • 重写父容器的 onInterceptTouchEvent() 方法
public boolean onInterceptTouchEvent(MotionEvent ev) {
    boolean intercepted = false;
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            break;
        case MotionEvent.ACTION_MOVE:
            if (true)    //如果父容器需要点击事件
                intercepted = true;
            else
                intercepted = false;
            break;
        case MotionEvent.ACTION_UP:
            break;

    }
    return intercepted;
}

内部拦截法

  • 重写子元素的 dispatchTouchEvent() 方法,并调用 requestDisallowInterceptTouchEvent() 方法
switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        getParent().requestDisallowInterceptTouchEvent(true);//设置之后,父元素无法拦截出ACTION_DOWN以外的其他事件
        break;
    case MotionEvent.ACTION_MOVE:
        if (true) {    //如果父容器需要点击事件
            getParent().requestDisallowInterceptTouchEvent(false);//这时,父元素可以开始拦截事件了
        }
        break;
    case MotionEvent.ACTION_UP:
        break;
    }
    return super.dispatchTouchEvent(ev);
}
  • 父元素也要默认拦截除了ACTION_DOWN以外的其他事件,这样当子元素调用parent.requestDisallowInterceptTouchEvent(false)方法时,父元素才能继续拦截所需的事件。
    public boolean onInterceptTouchEvent(MotionEvent event){
        int action = event.getAction();
        if(action == Motion.ACTION_DOWN){
            return false;
        }else{
            return true;
        }
    }