参考:https://github.com/devhuangxin/Blog/blob/master/事件分发前奏-从sdk源码到View、ViewGroup的步骤.md
1、Activity 启动完成后 ViewRootImpl 在添加 decor 的时候会注册一个 InputEventReceiver .
它并不是四大组件中的那个广播接收者, 但是工作形式可以说是类似 .
硬件的输入事件将会被 InputEventReceiver 接收到并执行应用层的操作, 具体由 InputStage 的各个子类来执行
其中 ViewPostImeInputStage 类用于实现触摸事件的相关处理.
2、ViewPostImeInputStage 会调用 mView.dispatchPointerEvent(event); 并接收一个返回值. 如果该方法返回true,那么触摸事件将会返回一个 FINISH_HANDLED 状态, 否则将会返回一个 FORWARD 状态
其中的 mView 就是 PhoneWindow 中的 DecorView, 也就是最开始我们说的 decor
3、DecorView 中 dispatchPointerEvent 调用了 Window.Callback 的 dispatchTouchEvent(ev) 方法, 这里的 Callback 就是 Activity 创建 Window(PhoneWindow) 的时候设置的 Activity 他自己
4、Activity 中 dispatchTouchEvent 调用了 window 的 superDispatchTouchEvent(ev) 方法.
找到 window 的具体实现 PhoneWindow, PhoneWindow 的 superDispatchTouchEvent(ev) 方法 调用了 decor 的 superDispatchTouchEvent(event);
5、然后 decor 的 superDispatchTouchEvent(event); 调用了 super.dispatchTouchEvent(event); .
这里 DecorView 是一个 FrameLayout 的实现. 这就是 一个触摸事件从系统源码分发到 View 层的实现
概括:
DecorView [dispatchPointerEvent]
|
Activity [dispatchTouchEvent] decor 的Window.Callback 代理
|
PhoneWindow [superDispatchTouchEvent]
|
DecorView [superDispatchTouchEvent]
|
DecorView [super.dispatchTouchEvent]
|
ViewGroup [dispatchTouchEvent] DecorView 继承自FrameLayout
网友评论