Android05:View相关

1. Activity中setContentView()发生了什么

  1. setContentView方法体内是调用的 getWindow().setContentView(layoutResID),
    getWindows() 返回的是一个mWindow引用,是一个phoneWindow类型的实例。
    public void setContentView(@LayoutRes int layoutResID) {
        getWindow().setContentView(layoutResID);
        initWindowDecorActionBar();
    }
  1. PhoneWindow.setContentView的作用
    1)installDecor():初始化DecorView对象()
    2)mLayoutInflater.inflate(layoutResID, mContentParent:``LayoutInflate.inflate 最终是调用 createViewFromTag 从 xml 生成 View 的,并通过addView添加到DecorView对象里面。

但此时 DecorView 还未被添加到 Window中。添加操作需要借助 ViewRootImpl

    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            mContentParent.removeAllViews();
        }

        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                    getContext());
            transitionTo(newScene);
        } else {
            mLayoutInflater.inflate(layoutResID, mContentParent);
        }
        mContentParent.requestApplyInsets();
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
        mContentParentExplicitlySet = true;
    }
  1. ViewRootImpl的作用
    ViewRootImpl的作用是用来衔接 WindowManagerDecorView,在 Activity被创建后会通过 WindowManagerDecorView添加到 PhoneWindow中并且创建 ViewRootImpl实例,随后将 DecorViewViewRootImpl进行关联,最终通过执行 ViewRootImpl的 performTraversals()开启整个View树的绘制

2. view 的绘制流程

View的绘制是从 ViewRootImplperformTraversals()方法开始,从最顶层的 View(ViewGroup)开始逐层对每个 View进行绘制操作

private void performTraversals() {
     ...............
    //measur过程
    performMeasure(childWidthMeasureSpec, childHeightMeasureSpec);
     ...............
    //layout过程
    performLayout(lp, desiredWindowWidth, desiredWindowHeight);
     ...............
    //draw过程
    performDraw();
}
  1. measure:测量宽高过程,如果是ViewGroup还要在onMeasure中对所有子View进行measure操作。
  2. layout:用于摆放View在ViewGroup中的位置,如果是ViewGroup要在onLayout方法中对所有子View进行layout操作。
  3. draw:往View上绘制图像。

3. DecorView何时才被WindowManager真正添加到Window中

  1. ActivityThreadhandleResumeActivity方法中,首先会调用ActivityonResume方法,接着调用Activity的makeVisible()方法

  2. makeVisible()中通过WindowManager.addView()完成了DecorView的添加和显示两个过程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值