吃透 Android 底层触控逻辑,根治项目常见交互 Bug
前言
做 Android 开发多年,绝大多数自定义控件、复杂页面交互异常,根源都指向触摸事件分发逻辑。很多开发者仅停留在 onTouch、onClick 表层调用,一旦遇到嵌套滚动、多层弹窗、多点触控、事件透传等复杂场景,只能靠临时重写方法强行兼容,无法从底层规避各类隐性 bug。
本文从 Framework 底层完整链路拆解触摸事件流转逻辑,打通 Activity、Window、顶级 DecorView、ViewGroup、普通 View 五层传递流程,结合系统源码梳理拦截、消费、冒泡三大核心机制,汇总日常开发中最高频的交互故障,配套可直接落地的底层解决方案,帮助开发者建立完整的触控底层知识体系,适配自定义控件、多层级交互页面、车载大屏等复杂开发场景。
一、触摸事件的底层流转起点:从硬件到 Activity 的完整链路
用户手指触碰屏幕产生硬件信号,经过内核输入驱动传递至 InputManagerService,再通过 Binder 通道转发至当前前台应用进程,最终由应用顶层 Activity 接收事件,整套流转分为三层链路:系统输入服务层、窗口管理层、应用视图层级。
1.1 Activity 作为事件分发入口的底层逻辑
Activity 中dispatchTouchEvent是应用接收触摸事件的第一个方法,系统会将 MotionEvent 对象完整传入,源码核心逻辑分为两步:先将事件交给窗口对象分发,若窗口内任意视图消费事件,直接返回 true 终止传递;若所有视图均未处理,事件回落至 Activity 自身的 onTouchEvent 方法处理。
窗口对象本质是 PhoneWindow,内部持有顶层 DecorVi
