美文网首页
Android重温事件分发机制

Android重温事件分发机制

作者: ana生 | 来源:发表于2018-06-12 11:00 被阅读0次

在这里自己也做个笔记,防止后续忘记复习。
Android事件分发机制的发生在View与View之间或者ViewGroup与View之间具有镶嵌的视图上,而且视图上必须为点击可用。当一个点击事件产生后,它的传递过程遵循如下顺序:Activity->Window->View,即事件先传递给Activity,再到Window,再到顶级View,才开始我们的事件分发

Android事件分发机制主要由三个重要的方法共同完成的

dispatchTouchEvent:用于进行点击事件的分发
onInterceptTouchEvent:用于进行点击事件的拦截
onTouchEvent:用于处理点击事件

这里需要注意的是View中是没有onInterceptTouchEvent()方法的

演示图如下:


F33ZD4S4UC[1O$]8TLDKW@1.png

正常分发流程如下:

 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一样

相关文章

网友评论

      本文标题:Android重温事件分发机制

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