大佬讲解视频:源码分析+讲解视频
文章仅是个人对此知识点的理解和总结,如果有不对的地方还请帮忙指正,感谢!


事件传递的过程:

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:
android中View的事件分发流程总结

ViewGroup:
android中View的事件分发流程总结

View:
android中View的事件分发流程总结

相关文章:

  • 2021-04-05
  • 2021-12-29
  • 2021-12-22
  • 2023-02-02
  • 2022-12-23
  • 2021-04-07
  • 2021-07-31
猜你喜欢
  • 2021-05-25
  • 2022-01-19
  • 2021-08-25
  • 2021-04-27
  • 2021-07-19
相关资源
相似解决方案