一直想写一篇关于事件传递的分析博文,因工作的原因,现在才有时间。
当前博文的源码分析是参考SDK19,示例代码是精简过的伪代码,具体以源码为准。
事件的开始
用户触摸手机屏幕时,系统会将事件传递给当前 Activity
,在 dispatchTouchEvent
中调用当前 Window(PhoneWindow).superDispatchTouchEvent
方法将事件继续往下传递。
1 | class Activity { |
在 PhoneWindow
中,将事件向下传递给了 DecorView.superDispatchTouchEvent
;DecorView实质上是一个ViewGroup,所以将其事件通过 dispatchTouchEvent
进行了继续传递。
1 | class DecorView extends FrameLayout { |
View与ViewGroup对事件的处理
Android视图主要分为 View
与 ViewGroup
,当DecorView DecorView.superDispatchTouchEvent
接收到事件后,询问 onInterceptTouchEvent
是否拦截该事件;
- 拦截
当事件被拦截后,会调用dispatchTransformedTouchEvent(ev, canceled, null,TouchTarget.ALL_POINTER_IDS)
传入的子view为null
,该方法的内部会调父类View#dispatchTouchEvent
,以此结束本次事件的传递。 - 未拦截
遍历所有的子view,此时子view可能是View
或ViewGroup
,调用子view的dispatchTouchEvent
方法,如果某个子view返回了true
,会调用addTouchTarget
记录下那个子view以便后续的触摸事件直接传递给该子view。
1 | class ViewGroup extends View { |
1 | class View { |
注:文章中可能有很多错误,也有可能出现无法使用的情况,因为此技术博文是我的学习笔记,我只是记载一些看到或者想到东西,所以我不推荐你来直接按照该博文的内容进行直接使用,谢谢~~