美文网首页
源码到View、ViewGroup事件分发分析

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

作者: Kevin_Lv | 来源:发表于2019-10-14 23:16 被阅读0次

    参考: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
    

    相关文章

      网友评论

          本文标题:源码到View、ViewGroup事件分发分析

          本文链接:https://www.haomeiwen.com/subject/ixzdmctx.html