Android事件分发解析(一)
关于Android的事件分发机制,一直以来都是开发者进阶路上必须突破的一道关卡,也是面试必定会问到的问题,今天我们就写个demo来深究一下其中的奥秘。
话不多说,直接切入正题,Activity布局如下:
![](https://img.haomeiwen.com/i2845801/9d60ec5ff72a185b.png)
用一个自定义ViewGroup嵌套一个自定义ViewGroup,在嵌套一个自定义TextView,我们首先看看ViewGroup1的自定义写法:
![](https://img.haomeiwen.com/i2845801/4fcbdfb940b6d64f.png)
再看ViewGroup2的写法:
![](https://img.haomeiwen.com/i2845801/77454b9aa12d147f.png)
最后是自定义TextView的代码
![](https://img.haomeiwen.com/i2845801/5a00fad8b60f1f49.png)
首页布局显示图如下:
![](https://img.haomeiwen.com/i2845801/c76f4dfccfb92812.png)
有了上面的一系列准备工作,下面就可以开始分析了,首先从最外层的ViewGroup1开始:
1.点击空白处:
![](https://img.haomeiwen.com/i2845801/a461b7fa3e13ad59.png)
由于空白处不属于任何ViewGroup或View,所以直接给Activity处理
2.点击viewgroup1:
![](https://img.haomeiwen.com/i2845801/13e63e053400fe33.png)
点击VP1区域,由于VP1本身没有做事件拦截处理,所以交给其父类,即最终的activity处理。
此时我们小小的做一下改变:
a.如果viewgroup1的dispatchTouchEvent返回true:
我们快速点击一下group1区域(此时只有down和up事件,没有move事件),打印如下:
![](https://img.haomeiwen.com/i2845801/89f3c84cab6fc1a6.png)
也就是说,dispatchTouchEvent方法返回true时,onTouchEvent方法不会被执行,并且他所有子view的触摸事件也不会被执行,DOWN\MOVE\UP三个触摸动作相应的结果会在dispatchTouchEvent方法中执行。此外该方法里面可以对单一事件(如down事件)进行分发判断,
b.如果viewgroup1的onInterceptTouchEvent方法返回true:
我们快速点击一下group1子类区域,log如下:
也就是说,此时所有子view的触摸事件都无效,统一交给了父类进行处理
![](https://img.haomeiwen.com/i2845801/0969efbc8774b2ce.png)
网友评论