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