Android的View体系(二):DecorView的创建与显示

本文详细探讨了Android中DecorView的创建与显示过程,从setContentView()开始,涉及PhoneWindow、WindowManager、ViewRootImpl,以及performTraversals()在绘制流程中的关键作用。通过对源码的分析,揭示了DecorView如何成为顶级View并显示内容。
摘要由CSDN通过智能技术生成

DecorView是顶级View,一般情况下它内部会包含一个竖直方向的LinearLayout,在这个LinearLayout里面有上下2部分,上面是标题栏,下面是内容栏。在Activity中我们通过setContentView所设置的布局文件其实就是被加载到内容栏之中。

本文,将介绍DecorView是如何创建与显示的。

说明:本文若无特殊说明,源码分析对应为api21。

一.DecorView的创建

上面我们提到,DecorView是显示的顶层View,那么View的绘制准备从DecorView开始说起。而DecorView的开始 就是我们熟悉的 setContentView()。

   //代码片1 (Activity类)
   public void setContentView(int layoutResID) {
   
        getWindow().setContentView(layoutResID);
        initWindowDecorActionBar();
    }

查看后发现,getWindow()返回的是Window类。而我们知道,Window是抽象类,而PhoneWindow是它的唯一实现类。也就是说,想了解 getWindow().setContentView(layoutResID) ,其实是PhoneWindow类的setContentView 方法。

//代码片2(PhoneWindow类)
@Override
    public void setContentView(int layoutResID) {
   
        // 1. 若mContentParent为空,创建一个DecroView
  		// mContentParent即为内容栏(content)对应的DecorView = FrameLayout子类
        if (mContentParent == null) {
   
            installDecor();      ---->分析1
        } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
   
            // 若不为空,则删除其中的View
            mContentParent.removeAllViews();
        }

        if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
   
            final Scene newScene = Scene.getSceneForLayout(mContentParent, layoutResID,
                    getContext());
            transitionTo(newScene);
        } else {
   
            // 2. 为mContentParent添加子View
           // 即Activity中设置的布局文件
            mLayoutInflater.inflate(layoutResID, mContentParent);
        }
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
   
            cb.onContentChanged();
        }
    }

我们来看一下代码片2中的分析1部分(即第7行代码):

//代码片3(PhoneWindow类)
 private void installDecor() {
   
        if (mDecor == null) {
   
            //1. 通过赋值可以发现,mDecor就是DecorView。
            //  (DecorView的描述)This is the top-level view of the window, containing the window decor. 
            //  private DecorView mDecor;
  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值