欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

UI绘制流程详解(2)

程序员文章站 2024-03-24 10:03:28
...

从源码角度分析一下三个问题

本文主要研究第二个问题

二、在Activity onCreate当中我们的setContentView是如何将UI文件加载?

注意:这里我们主要分析继承Activity的setContentView流程

 

首先,进入setContentView查看源码

UI绘制流程详解(2)

getWindow的对象是mWind,类名是Window

UI绘制流程详解(2)

这个Window类是一个抽象类,也就是说刚刚的setContentView是他的实现类所调用的。Window类上有一句注释,大概的意思是:这个Window的实现类有且只有一个实现类,那就是PhoneWindow。所以说,setContentView方法实际上市PhoneWindow来调用的,查看源码

UI绘制流程详解(2)

有三个地方需要需要注意

第一个是注释,也就是所让注意的说明,我理解的大概意思就是:主题属性等的设置在应该在安装window decor之前,而FEATURE_CONTENT_TRANSITIONS在安装window decor的时候被设置。这里面提到了 installing window decor,而下面正好有一个方法installDecor,这就是我们第二个需要注意的地方。我们点击去查看:

UI绘制流程详解(2)

翻阅这个方法的代码大概了解到主要是对两个属性的初始化:mDecor及mContentParent,查看这两个属性的注释

// This is the top-level view of the window, containing the window decor.
//这是窗体的*布局,包含了窗体的decor
private DecorView mDecor;

// This is the view in which the window contents are placed. It is either
// mDecor itself, or a child of mDecor where the contents go.
//窗口的内容放置在这个view上面。它或者是mDecor本身,或者是mDecor的子view
ViewGroup mContentParent;

注释很清楚的说明了两个属性的作用及关系。mDecor的初始化器没什么可说的。mContentParent的初始化器的名字叫做generateLayout,肯定和布局有关,查看源码:

UI绘制流程详解(2)

UI绘制流程详解(2)

这个方法中的代码篇幅比较长,但是需要注意的只有上面两个

第一个图片的翻译是窗体decor的渲染,而layoutResource是布局资源的索引,在第二张图片里,mDecor调用了onResourcesLoaded方法对布局资源进行了记载,查看这个方法源码:

UI绘制流程详解(2)

这句代码大家肯定都很熟悉,渲染了布局资源,这个布局资源使我们自己的布局吗,我们查看上上张图片的R.layout.screen_simple(以它为例)

UI绘制流程详解(2)

这么一看,就是到肯定不是,那这个布局是什么呢,我盗用KerwinBarry博客中的图片说明

UI绘制流程详解(2)

有小伙伴对右边的图片应该比较熟悉,就是系统的基本布局。而关于installDecor方法的查看在这里就是结束了,而installDecor方法做的事情就是:(1)加载了布局的容器(2)加载了系统的基本布局

回到第一幅图中,mLayoutInflater.inflate(layoutResID, mContentParent);这句代码就很好理解了,就是加载自己的布局资源

通过上面的分析,对于在Activity  onCreate当中我们的setContentView是如何将UI文件加载这个问题的答案已经很清楚了

欢迎留言,欢迎纠错,共同进步!