我们已经知道了Touch 事件的底层原理,同时我们也知道了Window的创建过程,在widow创建的过程中,每个Window 都有一个 ViewRootImpl 在 WindowManagerGlobal 的 addView 中创建, 并调用 setView ,来完成 window 的添加。在添加之前会调用requestLayout完成初始化绘制,添加之后也可以调用requestLayout 发起重绘请求。这里就需要区分一下 invalidate 和 requestLayout 的区别。
我们重新回到事件分发上来,上节说到,native层会通过 InputChannel 通过 socket 通信,将 Touch 事件发送到应用层,在 ViewRootImpl 的 setView 方法中,requestLayout 之后就会创建一个 inputChannel,在调用的 mWindowSession.addToDisplay 中,inputChannel 就是其中的一个参数。同时也是 WindowInputEventReceiver 的构造参数。 WindowInputEventReceiver 时 ViewRootImpl 的内部类,继承了 InputEventReceiver, 并重写了 onInputEvent 方法,
@Override
public void onInputEvent(InputEvent event, int displayId) {
enqueueInputEvent(event, this, 0, true);
}
在这里,将Touch事件交给了 应用层,结合Android 结构视图就可以分析出事件的分发顺序