源码到View、ViewGroup事件分发分析

参考: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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容