android ui 绘制过程,AndroidUI绘制流程,一步一步深入源码解析(一)

1、UI结构,从Activity的setContentView()入手;了解xml布局的嵌套关系

cfd96e1229e5

第一步、根据代码,源码中找到Actitivyt中setContentView()方法的实现,这里我用的是http://androidxref.com/在线源码阅读平台,选择8.0源码

cfd96e1229e5

/**

* Set the activity content from a layout resource.  The resource will be

* inflated, adding all top-level views to the activity.

*

* @param layoutResID Resource ID to be inflated.

*

* @see #setContentView(android.view.View)

* @see #setContentView(android.view.View, android.view.ViewGroup.LayoutParams)

*/

public void setContentView(@LayoutRes int layoutResID) {

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}

我们从activity中setCotentview()调用了getWindow().setContentView()方法。我们可以看到他调用了getWindow()方法,这个方法返回的是一个window对象。所以我的目标就转移到了Window类

第二步、Window是一抽象类,它提供标准的UI策略,例如背景、标题区域,默认密钥处理,它只有一个实现类PhoneWindow。我们在PhoneWindow中找到setContentView()方法

cfd96e1229e5

cfd96e1229e5

官网注释:这是放置窗口内容的视图,它要么是DecorView本身,或者是一个DecorView的子view。

这里猜测,mContentParent就是一个放置窗口内容的一个容器,父布局;

再进入installDecor();方法中查看,找到给mContentParent赋值的地方

cfd96e1229e5

接着再进入generateLayout()方法,最终找到给mDecor加载资源的地方

cfd96e1229e5

这里对象mLayoutInflater就是用来加载布局文件的,layoutResource就是要加载的布局id,前面一堆条件判断就是为layoutResource赋值,

这里layoutResource = R.layout.screen_simple

第三步、此时再找到DecorView中的onResourcesLoaded查看,

cfd96e1229e5

最终这个资源被加载到跟布局中;

总结一下以上流程,只是做了布局的初始化工作,将布局文件加载到了mContentParent中,但是还没有加载到Window中以及布局的绘制工作都没完成;

这里完成的跟布局大体结构如下:

cfd96e1229e5

cfd96e1229e5

那么decorView是如何添加到window上的呢,ui又是怎么样渲染绘制上去的呢?请看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值