Android Touch(1)事件的传递流程*
1.Activity,ViewGroup,View的关系
本文按层次比喻,ViewGroup与其中的View的关系不是父子,而是上下层。父子描述继承关系更准确些。
最下层是Activity,Activity上面是一系列ViewGroup,ViewGroup上面是View。
事件总是从Activity向上层传递。
2.触摸事件
一个手指在屏幕上触摸动作产生一组事件,其中常见的是 ACTION_DOWN,ACTION_MOVE...MOVE…MOVE、最后ACTION_UP。每一个事件都是从下层向上层传递。
单手指操作:ACTION_DOWN---ACTION_MOVE----ACTION_UP
多手指操作:ACTION_DOWN---ACTION_POINTER_DOWN---ACTION_MOVE--ACTION_POINTER_UP---ACTION_UP.
3.传递事件时的重要函数
▐ 事件分发:public boolean dispatchTouchEvent(MotionEvent ev)
▐ 事件拦截:public boolean onInterceptTouchEvent(MotionEvent ev)
▐ 事件响应:public boolean onTouchEvent(MotionEvent ev)
它们在同一层调用顺序是 dispatchTouchEvent--->onInterceptTouchEvent --->onTouchEvent
只有ViewGroup有onInterceptTouchEvent方法,如下表:
方法 | Activity |
ViewGroup |
View |
public boolean dispatchTouchEvent(MotionEvent ev) | 有 | 有 | 有 |
public boolean onInterceptTouchEvent(MotionEvent ev) | 无 | 有 | 无 |
public boolean onTouchEvent(MotionEvent ev) | 有 | 有 | 有 |
它们的返回值含义或功能表如下:
方法\返值 | true | false | super.同名函数 | |
Activity | dispatchTouchEvent | 消费 | 消费 | 不消费,续传 |
onTouchEvent | 消费 | 消费 | 消费 | |
ViewGroup | dispatchTouchEvent | 消费 |
不消费,回溯 |
不消费,续传 |
onInterceptTouchEvent |
拦截 |
不消费,续传 | 不消费,续传 | |
onTouchEvent |
消费 |
不消费,回溯 | 不消费,回溯 | |
View | dispatchTouchEvent | 消费 | 不消费,回溯 | 不消费,续传 |
onTouchEvent | 消费 | 不消费,回溯 | 不消费,回溯 |
4.事件传递流程参考图
图中:
- 每条泳道是不同的处理类,
- 整个图是U型,绿色粗箭头。事件以Activity开始,也以它结束(所有人都没处理时,最后就由activity处理)。
- 细实箭头是返回true,虚线是返回false,粗线是返回super.XX同名方法。
- super.xxx是保证事件能继续传递的调用。是U型图的主线。
- dispatchTouchEvent、onTouchEvent返回true表示处理了事件。返回false都表示把事件传回前一层。
- 当down在某处被消费(返回true)后,后续的move,up就以短路径过去,不是按原路径。
5.其它参考资料
点击下载 PRE_andevcon_mastering-the-android-touch-system.pdf
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?