美文网首页自定义控件
android 事件分发消费

android 事件分发消费

作者: 三月四晴 | 来源:发表于2019-10-30 11:51 被阅读0次

推荐一个干货学习笔记https://github.com/GcsSloop/AndroidNote
ps.不是个人的 纯属分享 本篇文章讲解也摘抄自此 感谢大佬

定义:安卓上面的View是树形结构的,View可能会重叠在一起,当我们点击的地方有多个View都可以响应的时候,这个点击事件应该给谁呢?为了解决这一个问题,就有了事件分发机制。

结构:我们的View是树形结构的 laout 大致如此如此结构


image.png

事件分发、拦截与消费:
这个3个方法都是Boolean方法 只有正确返回super对应的方法或者false才会继续消息传递(这个步骤的化 小伙伴可以自己写一个demo体验下)


image.png

这是activity的 他只有dispatchTouchEvent 事件分发 以及onTouchEvent消费方法


image.png
最外层父布局viewgroupA(继承的是LinearLayout 而LinearLayout继承的是ViewGroup) viewgroup的化比activity和view多了一个 拦截方法onInterceptTouchEvent
image.png
第二层布局viewgroupB
image.png

最后是myview(继承的textview textview继承的view)


image.png
没有实现myview的的setOnClickListener方法 点击myview看下logcat
image.png

但是注意到Textview的分发上一步执行的是viewgroupB的onInterceptTouchEvent 抱着疑问先去掉viewgroupB这层直接入viewgroupA包含view


image.png

在执行看下


image.png
发现onInterceptTouchEvent 依然执行了 也就是说
activty是最先知道用户点击屏幕这件事情 然后通过dispatchTouchEvent传递给viewgroup的dispatchTouchEvent在通过onInterceptTouchEvent 事件拦截方法 告诉了view 如果把 onInterceptTouchEvent 默认的 return super.onInterceptTouchEvent(ev) 换成true和false 会发生什么
image.png
image.png

view的事件没有执行 return false 和return super. 一样


image.png

所以最后的总结就是
分发流程
activity > viewgroup >Textview (注意textview的分发是执行在viewgroup的拦截事件下的)
消费的流程(默认不进行拦截)
view > viewgroup > actvity
如果有消费的情况发生 实现textview 的点击方法
最上面有一给没实现的log对比看下
没有实现点击


image.png

实现点击


image.png
image.png

发现会多一次分发的流程 因为实现点击的判断是触摸屏幕并且离开才会产生 而且viewgroup 和activity的onTouchEvent 都没有执行说明消费了的事件不会往上级传递

(ps.最后还是建议 跑一下代码 在不同的事件return true false 体验一下)

相关文章

网友评论

    本文标题:android 事件分发消费

    本文链接:https://www.haomeiwen.com/subject/mwswvctx.html