相较其它知识来说事件分发机制还是有一定难度的,属于Android 进阶方面的知识,对于初学者来说,还是很乱的,所以建议先掌握好基础,再想办法进阶。我在学习事件分发机制时,也是反复学习,尤其是第一次看这块,感觉还是很麻烦的,咬着牙看完别人的博客,简单看看源码,看完这后,感觉自己还是没有理解,不过事情总要有个开头吧,所以在那之后,有时间了,再次看,发现收获,还是比之前多些,所以发现有些问题不能着急。
首先事件分发机制的顺序大家需要知道即,Activity
-> ViewGroup
-> View
三个比较重要的方法
dispatchTouchEvent() 负责事件分发
onInterceptTouchEvent() 负责事件拦截
onTouchEvent() 进行事件处理
如果一个View 点击后响应了点击事件,那么简单谈一谈其流程
当一个点击事件发生时,事件最先传到Activity
的dispatchTouchEvent() ,在该方法里会调用Window的superDispatchTouchEvent(ev),在该方法里又会调用DecorView的superDispatchTouchEvent(event),在该方法里又会调用super.dispatchTouchEvent(event),(因为DecorView继承自FrameLayout,所以ViewGroup 为DecorView的父类),所以这一系列调用,最终会调用到ViewGroup 的dispatchTouchEvent()方法,(如果简化的说可以理解为事件传递到Activity
的dispatchTouchEvent(),经过一系列方法,传递到ViewGroup 的dispatchTouchEvent())。
然后ViewGroup 调用onInterceptTouchEvent(ev) 返回false 表示不拦截事件,那么遍历其子View 找到正在点击的子View,调用child.dispatchTouchEvent(ev) ,即将事件传递到View 的dispatchTouchEvent() 。
在View 的dispatchTouchEvent() 里调用onTouchEvent(event) ,之后又调用performClick(),在改方法里调用mOnClickListener.onClick(this) 就回调了点击事件,之后伴随着一系列方法的return ,出栈,一次点击事件结束。
简单描述流程图