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将不被调用
网友评论