View的事件分发机制(上)

2018-10-23  本文已影响0人  FourStars

在我们使用手机的时候,会与应用进行各种交互行为,每次滑动,点击都是一种触摸事件,在Android中有如下一些触摸事件

如何分发触摸事件

image.png

大致分发流程
Activity收到事件,并传给小弟处理(DecorView也是一个ViewGroup)

Activity -> PhoneWindow -> ViewGroup -> ... -> View

若小弟处理不了,则回传给Activity

Activity <- PhoneWindow <- ViewGroup <- ... <- View

对于事件,Android中有三个方法来处理它

Activity,ViewGroup,View中是否含有上述方法

方法 Activty ViewGroup View
dispatchTouchEvent()
onInterceptTouchEvent() × ×
onTouchEvent()

由上表可见,Activity和View都没有拦截事件的方法
因为Activiy处于事件分发的顶端,若拦截了,View就无法做出响应,影响用户体验
而View处于最底层,再拦截事件已经没有意义,要么就处理掉事件,要么就不做处理

分发流程的比喻

在方法中进行打印log,默认调用父类方法(即返回值均为false),布局如下

image.png

Tips:操作方式为点击ChildView,只有Down,没有Up的行为,模拟器上鼠标按住即可

dispatchTouchEvent: ---------ViewActivity--老板:接到活啦
dispatchTouchEvent: ---------RootView-----经理:我也接到活啦
onInterceptTouchEvent: -----RootView-----经理:偷懒,丢给员工做
dispatchTouchEvent: ---------ChildView----员工:狗经理又来压榨我了,收到任务
onTouchEvent: -----------------ChildView----员工:发现做不了,告知经理
onTouchEvent: -----------------RootView----经理:报告老板,做不了啊!
onTouchEvent: -----------------ViewActivity-老板:报告客户,这活我不做了

ChildView中onTouchEvent为true时,即员工发现这个活自己能做,则经理和老板就不用处理啦

dispatchTouchEvent: ---------ViewActivity
dispatchTouchEvent: ---------RootView
onInterceptTouchEvent: -----RootView
dispatchTouchEvent: ---------ChildView
onTouchEvent: -----------------ChildView

RootView中onInterceptTouchEvent为true时,经理有B数,知道员工做不了,就不告知员工了,此时员工不需要处理,只要经理上报回老板即可

dispatchTouchEvent: -------ViewActivity
dispatchTouchEvent: -------RootView
onInterceptTouchEvent: ---RootView
onTouchEvent: ---------------RootView
onTouchEvent: ---------------ViewActivity

总结

对于 dispatchTouchEvent

简而言之就是true时会回调onTouchEvent(),false则不回调

对于 onInterceptTouchEvent
拦截后(返回值为true),下一层不会回调dispatchTouchEvent(),而是自己处理,更不会回调下一层的onTouchEvent()

对于 onTouchEvent
false的话就会告知上层,让上层进行处理
而true的话,自己做完后就行,不必汇报上层

参考(copy)

安卓自定义View进阶-事件分发机制原理

上一篇 下一篇

猜你喜欢

热点阅读