ViewRoot和DecorView

来源:互联网 发布:qq群发推广软件 编辑:程序博客网 时间:2024/04/30 08:58

  ViewRoot实际是一个HandlerViewRoot建立主ViewWindowsManger通讯的桥梁。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。

1 0
原创粉丝点击