外观
触摸事件是怎样分发的?
标准回答
在典型 View 层级中,事件从窗口进入 Activity,再沿 ViewGroup 向目标子 View 分发。dispatchTouchEvent 负责调度;ViewGroup 的 onInterceptTouchEvent 决定是否拦截给自己处理;onTouchEvent 负责处理事件。返回 true 通常表示在该层接受或消费事件。(ViewGroup 触摸事件管理)
机制解释
一次手势通常从 DOWN 开始,经多个 MOVE,到 UP 或 CANCEL 结束。子 View 在 DOWN 阶段接住事件,通常才能成为后续事件的目标。父容器中途拦截时,原目标子 View 会收到 CANCEL。
延伸追问
OnTouchListener 和 onTouchEvent 谁先?在满足启用等条件时,监听器可先处理;监听器返回 true 后通常不会再进入该 View 的 onTouchEvent。不要让监听器无条件消费所有事件,导致点击逻辑失效。
内容来源
- Android 智能硬件 SDK 技术 Wiki · 原条目
Q13