【Android开发坑系列】之事件分发机制
总结一下:
- 事件序列的定义:从手触摸屏幕(含)到离开屏幕(含)期间所发生的一系列交互事件。
主要由ACTION_DOWN、ACTION_MOVE、ACTOIN_UP、ACTION_CANCEL等组成,其中一次事件序列中,DOWN和UP都只有最多一个,MOVE有若干个,可以为0个。
定律:某个View只有将ACTION_DOWN处理(消费)掉,才会有机会处理后面的ACTION_MOVE和ACTION_UP。 - 定律:正常情况下,一个事件序列只能被一个View 拦截且消耗。 因为一旦一个元素拦截了某事件,那么同一个事件序列内的所有事件都会直接交给它处理,因此同一个事件序列中的事件不能分别由两个View同时处理。 但是通过特殊手段可以做到,比如一个View将本该自己处理的事件通过 onTouchEvent 强行传递给其他 View 处理。
- 事件分发中只有两个主角:ViewGroup和View。
ViewGroup包含onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent三个有关方法,View仅包含dispatchTouchEvent、onTouchEvent两个有关方法。其中ViewGroup又继承于View。
ViewGroup 默认不拦截任何事件。Android 源 码中 ViewGroup 的 onInterceptTouchEvent 方法默认返回 false。 - 事件传递的两种方式:
隧道方式:从根元素依次往下传递直到最内层子元素;
冒泡方式:从最内层子元素依次往外传递直到根元素。
dispatchTouchEvent是隧道方式,onTouchEvent是冒泡方式(若返回true,则上层不再处理)。
- parent.requestDisallowInterceptTouchEvent(boolean)的作用:在子View中有机会告诉父View是否要拦截事件。
注意:无法通过调用该方法让父View拦截ACTION_DOWN事件。
参考:
《Android开发艺术探索》
《Android - 事件模型》https://www.cnblogs.com/bill-joy/archive/2012/03/20/2407928.html
本博客所有随笔,若未明确标示为转载或未带有原文链接,皆为原创。
本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
本博客所有随笔版权归博客园和kai.ma所有,欢迎转载,转载请保留:
- 出处:http://kaima.cnblogs.com
- 作者:kai.ma
分类:
Android
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
2008-09-07 最佳黑色背景的Visual Studio 2005/2008配置-尤其适合开发人员使用