Touch事件的产生及传递到DecorView的路线

Touch事件的产生

之前写了一篇touchEvent分发的,讲了事件在ViewGruop中的传递。
这篇记录下学习的事件生成的大致过程。

首先是事件服务的初始化部分。

这部分的核心是native部分的框架。有很多C++的代码,我基本选择略过。
服务的启动涉及到 WindowManagerService -> InputManagerService .
然后是native层的 NativeInputManager -> InputManager .
InputManager包含 InputDispatcher 和 InputReader .
这两个会被封装成两个线程 InputReaderThread 和 InputDispatcherThread ,分别负责读和分发。
跳过一大段, 到 InputChannel 和 NativeInputEventReceiver.cpp 再调用到 InputEventReceiver.java 的 dispatchInputEvent。
子类 WindowInputEventReceiver 中开始方法跳转 onInputEvent -> enqueueInputEvent
-> doProcessInputEvents -> deliverInputEvent -> stage.deliver(q) .
stage是个InputStage对象. 在这个对象的 processPointerEvent 方法中,调用的view的dispatchPointerEvent方法。

这时候对象就来到了 DecorView ,即Window 的最底层View. 也是PhoneWindow 的 内部类。
从DecorView开始又要绕绕圈了。
DecorView 的 dispatchTouchEvent 里有句 cb.dispatchTouchEvent(ev) 。cd是个 Window.Callback 对象。Activity实现了这个接口 。cb实际就是Activity,那么就会调用Activity的 dispatchTouchEvent 方法。

public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            onUserInteraction();
        }
        if (getWindow().superDispatchTouchEvent(ev)) {
            return true;
        }
        return onTouchEvent(ev);
    }

可以看到,调用了 getWindow().superDispatchTouchEvent(ev) 。并且同View的传递机制一样,如果 getWindow().superDispatchTouchEvent(ev) 不消费该事件,才会 调用Activity自己的onTouchEvent 。
这句getWindow().superDispatchTouchEvent(ev) 会调用到PhoneWindow的superDispatchTouchEvent。 然后调用到DecorView 的 superDispatchTouchEvent。
最终调用super.dispatchTouchEvent 。DecorView继承自 FrameLayout ,所以,实际调用ViewGroup的 dispatchTouchEvent。自此成功传递到了View的视图层级中,可以开始层级中的分发了。
以下是一个比较细的底层代码分析。
http://www.cnblogs.com/haiming/p/3318614.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值