大佬讲解视频:源码分析+讲解视频
文章仅是个人对此知识点的理解和总结,如果有不对的地方还请帮忙指正,感谢!
事件传递的过程:
Activity ——> Window——> DecorView ——> ViewGroup——> View
讲解:
1:Activity 通过调用super中的方法把事件传递到Window。
2:Window是个抽象类没有方法的实现,它的唯一实现类是PhoneWindow,所以事件就到了PhoneWindow中,
PhoneWindow方法中调用DecorView(View的根布局)中的方法,事件就传到了 DecorView。
3:DecorView中通过调用super中的方法把事件传递到ViewGroup中。
4:在ViewGroup中找到能响应事件的View,再调用View的方法把事件传递到View中处理。
事件的分发流程:
Activity:dispatchTouchEvent
|
Activity:onUserInteraction 事件刚开始就调用,是个空方法,可以重写在方法中加入自己逻辑
|
ViewGroup: dispatchTouchEvent
|
ViewGroup:onInterceptTouchEvent 拦截:return true —> ViewGroup:onTouchEvent —> Activity:onTouchEvent
| 不拦截: return false
View:dispatchTouchEvent
|
View:onTouchEvent
|
ViewGroup:onTouchEvent
|
Activity:onTouchEvent
注意:
1:dispatchTouchEvent:事件开始派发 onTouchEvent:处理事件,并返回事件是否被消费(true:消费 false:未消费)。
2:Activity中的onUserInteraction 方法标志着事件刚开始,是个空方法,可以重写在方法中加入自己逻辑。
3:ViewGroup中特有的onInterceptTouchEvent方法可以拦截事件(拦截:return true;不拦截: return false)。
拦截后:事件不在向子View传递,需要ViewGroup重写父类View的onTouchEvent方法,
自己处理事件(ViewGroup没有onTouchEvent方法)。
不拦截:事件会分发给相对应的View,View通过onTouchEvent方法处理事件,并返回事件的消费结果。
4:同一个事件序列,如果子View(ViewGroup)没有处理改事件(没有消费该事件),那么后续事件就不会再传递到子View中
个人理解思路:
事件是一层层的通过dispatchTouchEvent方法往下派发的,从最外层的ViewGroup一直派发到最内层的View(中间可以经过多个ViewGroup),然后通过onTouchEvent方法处理完事件,再从最内层的View依次往外返回事件的消费结果。
最后附上Activity、ViewGroup、View的流程图(视频中老师整理的)便于理解:
Activity:
ViewGroup:
View: