美文网首页
Android 事件分发 (MViewGroup MVie

Android 事件分发 (MViewGroup MVie

作者: 詠遠鍀飛哥 | 来源:发表于2021-03-01 14:18 被阅读0次

Android 事件分发 (MViewGroup MView)

1.不消费事件
事件分发_MViewGroup: dispatchTouchEvent:按下
事件分发_MViewGroup: onInterceptTouchEvent:按下
事件分发_MView: dispatchTouchEvent:按下
事件分发_MView: onTouchEvent:按下
事件分发_MViewGroup: onTouchEvent:按下
2.MViewGroup onTouchEvent 返回true 消费事件
事件分发_MViewGroup: dispatchTouchEvent:按下
事件分发_MViewGroup: onInterceptTouchEvent:按下
事件分发_MView: dispatchTouchEvent:按下
事件分发_MView: onTouchEvent:按下
事件分发_MViewGroup: onTouchEvent:按下
事件分发_MViewGroup: dispatchTouchEvent:抬起
事件分发_MViewGroup: onTouchEvent:抬起
3.MView onTouchEvent 返回true消费事件
事件分发_MViewGroup: dispatchTouchEvent:按下
事件分发_MViewGroup: onInterceptTouchEvent:按下
事件分发_MView: dispatchTouchEvent:按下
事件分发_MView: onTouchEvent:按下
事件分发_MViewGroup: dispatchTouchEvent:抬起
事件分发_MViewGroup: onInterceptTouchEvent:抬起
事件分发_MView: dispatchTouchEvent:抬起
事件分发_MView: onTouchEvent:抬起
4.在3的条件下,MViewGroup onInterceptTouchEvent 返回true
事件分发_MViewGroup: dispatchTouchEvent:按下
事件分发_MViewGroup: onInterceptTouchEvent:按下
事件分发_MViewGroup: onTouchEvent:按下
5.MView消费事件,将MViewGroup 的Move事件拦截 onInterceptTouchEvent 返回true
事件分发_MViewGroup: dispatchTouchEvent:按下
事件分发_MViewGroup: onInterceptTouchEvent:按下
事件分发_MView: dispatchTouchEvent:按下
事件分发_MView: onTouchEvent:按下
事件分发_MViewGroup: dispatchTouchEvent:移动
事件分发_MViewGroup: onInterceptTouchEvent:移动
事件分发_MView: dispatchTouchEvent:取消
事件分发_MView: onTouchEvent:取消
事件分发_MViewGroup: dispatchTouchEvent:移动
事件分发_MViewGroup: onTouchEvent:移动
事件分发_MViewGroup: dispatchTouchEvent:移动
事件分发_MViewGroup: onTouchEvent:移动
事件分发_MViewGroup: dispatchTouchEvent:抬起
事件分发_MViewGroup: onTouchEvent:抬起

可以看出,Move事件拦截后,后续事件序列都会被MViewGroup消费,原来应该消费事件的MView会收到CANCEL事件
6.继续在5上, 在MView的onTouchEvent中将 parent.requestDisallowInterceptTouchEvent(true)
事件分发_MViewGroup: dispatchTouchEvent:按下
事件分发_MViewGroup: onInterceptTouchEvent:按下
事件分发_MView: dispatchTouchEvent:按下
事件分发_MView: onTouchEvent:按下
事件分发_MViewGroup: dispatchTouchEvent:移动
事件分发_MView: dispatchTouchEvent:移动
事件分发_MView: onTouchEvent:移动
事件分发_MViewGroup: dispatchTouchEvent:抬起
事件分发_MView: dispatchTouchEvent:抬起
事件分发_MView: onTouchEvent:抬起

总结

当onTouch()事件返回true 时, onTouchEvent()将不被调用
public boolean dispatchTouchEvent(MotionEvent event) {
    if (li != null && li.mOnTouchListener != null
                    && (mViewFlags & ENABLED_MASK) == ENABLED
                    && li.mOnTouchListener.onTouch(this, event)) {
                result = true;
    }

    if (!result && onTouchEvent(event)) {
                result = true;
    }
}

onInterceptTouchEvent 只要在某个事件序列返回true, 后续事件序列中将不再被调用
onInterceptTouchEvent只在返回true或者requestDisallowInterceptTouchEvent(true)后不再被调用
if(disallowIntercept || !onInterceptTouchEvent(ev)){
    // 下发事件给子view
}
disallowIntercept 是否禁用事件拦截功能 默认false
当 requestDisallowInterceptTouchEvent(true)调用时,onInterceptTouchEvent将不被调用

相关文章

网友评论

      本文标题:Android 事件分发 (MViewGroup MVie

      本文链接:https://www.haomeiwen.com/subject/uklafltx.html