在这里自己也做个笔记,防止后续忘记复习。
Android事件分发机制的发生在View与View之间或者ViewGroup与View之间具有镶嵌的视图上,而且视图上必须为点击可用。当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View,即事件先传递给Activity,再到Window,再到顶级View,才开始我们的事件分发
Android事件分发机制主要由三个重要的方法共同完成的
dispatchTouchEvent:用于进行点击事件的分发
onInterceptTouchEvent:用于进行点击事件的拦截
onTouchEvent:用于处理点击事件
这里需要注意的是View中是没有onInterceptTouchEvent()方法的
演示图如下:
正常分发流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
MyViewGroup1 onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
MyViewGroup1 onTouchEvent
MyViewGroup2 onTouchEvent
1、dispatchTouchEvent(分发事件)
如果在MyViewGroup1的dispatchTouchEvent中返回true,表示MyViewGroup1消费了整个事件,即不会再分发,也不会再处理。流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
如果在MyViewGroup1的dispatchTouchEvent中返回false,表示MyViewGroup1点击事件在本层不再分发,并交由上层的onTouchEvent进行消费。流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
MyViewGroup2 onTouchEvent
2、onInterceptTouchEvent(拦截事件)
如果在MyViewGroup1的onInterceptTouchEvent中返回true,表示MyViewGroup1拦截了本次点击事件,不再继续向下分发,即MyView不再执行dispatchTouchEvent方法。但是只是分发结束了而已,接着开始处理事件。流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
MyViewGroup1 onInterceptTouchEvent
MyViewGroup1 onTouchEvent
MyViewGroup2 onTouchEvent
如果在MyViewGroup1的onInterceptTouchEvent中返回false,表示MyViewGroup1不会拦截本次点击事件,继续往下分发。流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
MyViewGroup1 onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
MyViewGroup1 onTouchEvent
MyViewGroup2 onTouchEvent
3、onTouchEvent(消费事件)
如果在MyViewGroup1的onTouchEvent中返回true,表示MyViewGroup1可以将该事件直接消费掉,即分发结束后,处理事件的时候,直接处理到MyViewGroup1就可以结束了。流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
MyViewGroup1 onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
MyViewGroup1 onTouchEvent
如果在MyViewGroup1的onTouchEvent中返回false,表示MyViewGroup1不可以将本次点击事件消费掉,即事件继续往上处理。流程如下:
MyViewGroup2 dispatchTouchEvent
MyViewGroup2 onInterceptTouchEvent
MyViewGroup1 dispatchTouchEvent
MyViewGroup1 onInterceptTouchEvent
MyView dispatchTouchEvent
MyView onTouchEvent
MyViewGroup1 onTouchEvent
MyViewGroup2 onTouchEvent
总结如下:
dispatchTouchEvent
return true:表示该View内部消化掉了所有事件
return false:表示事件在本层不再继续进行分发,并交由上层控件的onTouchEvent方法进行消费
return super.dispatchTouchEvent(ev):默认事件将分发给本层的事件拦截onInterceptTouchEvent方法进行处理
onInterceptTouchEvent
return true:表示将事件进行拦截,并将拦截到的事件交由本层控件的onTouchEvent进行处理
return false:表示不对事件进行拦截,事件得以成功分发到子View
return super.onInterceptTouchEvent(ev):默认表示不拦截该事件,并将事件传递给下一层View的dispatchTouchEvent
onTouchEvent
return true:表示onTouchEvent处理完事件后消费了此次事件
return fasle:表示不响应事件,那么该事件将会不断向上层View的onTouchEvent方法传递,直到某个View的onTouchEvent方法返回true
return super.dispatchTouchEvent(ev):表示不响应事件,结果与return false一样