ViewRoot实际是一个Handler,ViewRoot建立主View与WindowsManger通讯的桥梁。ViewRoot在本质上一个Handler。我们知道Handler的基本功能就是处理回调,发送消息。ViewRoot 对应于ViewRootImpl类,View的三大流程都是通过ViewRoot来完成的。在ActivityThread中,当Activity对象被创建完毕之后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。
ViewRoot对触屏事件的处理:
public final class ViewRoot extends Handler implements ViewParent,
View.AttachInfo.Callbacks {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case DISPATCH_POINTER: {
MotionEvent event = (MotionEvent) msg.obj;
try {
deliverPointerEvent(event);
} finally {
event.recycle();
if (msg.arg1 != 0) {
finishInputEvent();
}
}
} break;
}
}
ViewRoot接收到触屏事件,调用
deliverPointerEvent方法,deliverPointerEvent的代码如下:
private void deliverPointerEvent(MotionEvent event) {
boolean handled;
boolean isDown = event.getAction() == MotionEvent.ACTION_DOWN;
handled = mView.dispatchTouchEvent(event);
if (!handled && isDown) {
final int edgeFlags = event.getEdgeFlags();
if (edgeFlags != 0 && mView instanceof ViewGroup) {
View nearest = FocusFinder.getInstance().findNearestTouchable(
((ViewGroup) mView), x, y, direction, deltas);
if (nearest != null) {
mView.dispatchTouchEvent(event);
}
}
}
事件最终会交给dispatchTouchEvent进行处理。
DecorView作为顶级View,一般情况下它内部会包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下两个部分,上面是标题栏,下面是内容栏。通过源码我们可以知道,DecorView其实是一个Framglayout,View层的事件都先经过DecorView,然后才传递给我们的View。