ViewRoot和DecorView

  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。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值