推荐一个干货学习笔记https://github.com/GcsSloop/AndroidNote
ps.不是个人的 纯属分享 本篇文章讲解也摘抄自此 感谢大佬
定义:安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解决这一个问题,就有了事件分发机制。
结构:我们的View是树形结构的 laout 大致如此如此结构
![](https://img.haomeiwen.com/i13934769/dfb8801fa8a87c14.png)
事件分发、拦截与消费:
这个3个方法都是Boolean方法 只有正确返回super对应的方法或者false才会继续消息传递(这个步骤的化 小伙伴可以自己写一个demo体验下)
![](https://img.haomeiwen.com/i13934769/d5ee076022dec5ca.png)
这是activity的 他只有dispatchTouchEvent 事件分发 以及onTouchEvent消费方法
![](https://img.haomeiwen.com/i13934769/800b19f570e47b73.png)
最外层父布局viewgroupA(继承的是LinearLayout 而LinearLayout继承的是ViewGroup) viewgroup的化比activity和view多了一个 拦截方法onInterceptTouchEvent
![](https://img.haomeiwen.com/i13934769/efe837cd1c623f31.png)
第二层布局viewgroupB
![](https://img.haomeiwen.com/i13934769/d24c1f98677046bc.png)
最后是myview(继承的textview textview继承的view)
![](https://img.haomeiwen.com/i13934769/1245112801187e8c.png)
没有实现myview的的setOnClickListener方法 点击myview看下logcat
![](https://img.haomeiwen.com/i13934769/5ba85378ed6cbff1.png)
但是注意到Textview的分发上一步执行的是viewgroupB的onInterceptTouchEvent 抱着疑问先去掉viewgroupB这层直接入viewgroupA包含view
![](https://img.haomeiwen.com/i13934769/4c37f62c34732f3f.png)
在执行看下
![](https://img.haomeiwen.com/i13934769/a6c6d7ff7c2e9a36.png)
发现onInterceptTouchEvent 依然执行了 也就是说
activty是最先知道用户点击屏幕这件事情 然后通过dispatchTouchEvent传递给viewgroup的dispatchTouchEvent在通过onInterceptTouchEvent 事件拦截方法 告诉了view 如果把 onInterceptTouchEvent 默认的 return super.onInterceptTouchEvent(ev) 换成true和false 会发生什么
![](https://img.haomeiwen.com/i13934769/759c7e150ee47d28.png)
![](https://img.haomeiwen.com/i13934769/73561e35fd298964.png)
view的事件没有执行 return false 和return super. 一样
![](https://img.haomeiwen.com/i13934769/e1f77ae7c8a653bd.png)
所以最后的总结就是
分发流程
activity > viewgroup >Textview (注意textview的分发是执行在viewgroup的拦截事件下的)
消费的流程(默认不进行拦截)
view > viewgroup > actvity
如果有消费的情况发生 实现textview 的点击方法
最上面有一给没实现的log对比看下
没有实现点击
![](https://img.haomeiwen.com/i13934769/b6b7a89866ce9a77.png)
实现点击
![](https://img.haomeiwen.com/i13934769/bc9eb2357a7941ea.png)
![](https://img.haomeiwen.com/i13934769/8c7f162cebec7ae0.png)
发现会多一次分发的流程 因为实现点击的判断是触摸屏幕并且离开才会产生 而且viewgroup 和activity的onTouchEvent 都没有执行说明消费了的事件不会往上级传递
网友评论