2018-01-22
2018-03-27 本文已影响3人
爱编程的码农
Android事件分发解析(一)
关于Android的事件分发机制,一直以来都是开发者进阶路上必须突破的一道关卡,也是面试必定会问到的问题,今天我们就写个demo来深究一下其中的奥秘。
话不多说,直接切入正题,Activity布局如下:

用一个自定义ViewGroup嵌套一个自定义ViewGroup,在嵌套一个自定义TextView,我们首先看看ViewGroup1的自定义写法:

再看ViewGroup2的写法:

最后是自定义TextView的代码

首页布局显示图如下:

有了上面的一系列准备工作,下面就可以开始分析了,首先从最外层的ViewGroup1开始:
1.点击空白处:

由于空白处不属于任何ViewGroup或View,所以直接给Activity处理
2.点击viewgroup1:

点击VP1区域,由于VP1本身没有做事件拦截处理,所以交给其父类,即最终的activity处理。
此时我们小小的做一下改变:
a.如果viewgroup1的dispatchTouchEvent返回true:
我们快速点击一下group1区域(此时只有down和up事件,没有move事件),打印如下:

也就是说,dispatchTouchEvent方法返回true时,onTouchEvent方法不会被执行,并且他所有子view的触摸事件也不会被执行,DOWN\MOVE\UP三个触摸动作相应的结果会在dispatchTouchEvent方法中执行。此外该方法里面可以对单一事件(如down事件)进行分发判断,
b.如果viewgroup1的onInterceptTouchEvent方法返回true:
我们快速点击一下group1子类区域,log如下:
也就是说,此时所有子view的触摸事件都无效,统一交给了父类进行处理
