android应用安装过程及原理,UI绘制流程及原理

### 参考文章

[Android应用程序窗口(Activity)](https://www.kancloud.cn/alex_wsc/androids/473768)

[简述Activity与Window关系](https://www.kancloud.cn/alex_wsc/androidsystem/483890)

[Android群英传之Android控件结构与自定义控件详解](https://www.kancloud.cn/alex_wsc/heros/156870)

![](http://hujiaweibujidao.github.io/images/androidheros_ui.png)

![](https://img.kancloud.cn/aa/14/aa14859dd5bc6d0e1986aeaf63f6b482_1534x737.png)

### View是如何被添加到屏幕窗口上的

* 创建顶层布局容器DecroView

* DecorView是一个ViewGroup容器,寄存FrameLayout,是PhoneWindow的一个实例,是所有应用程序的顶层View,在系统内部进行初始化,当DecorView初始化完成后,系统会根据应用程序的主题特性(比如线性布局或者相对布局等特性)去加载一个基础容器(比如NoActionBar或者DarkActionBar),不同的主题,加载的基础容器也不一样,但是无论如何,在基础容器里面都有一个`com.android.internal.R.id.content`的容器,它是一个FrameLayout,

* 在顶层不居中加载基础布局ViewGroup

* 将ContentView添加到基础布局中的FrameLayout中

* 开发者通过`setContentView`自己编写的布局xml文件 经过解析之后被添加到了这样一个FrameLayout中

### View的绘制流程

* 绘制入口

```

ActivityThread.handleResumeActivity

-->WindowManagerImpl.addView(decorView,layoutParams)

-->WindowManagerGlobal.addView()

```

* 绘制的类及方法

```

ViewRootImpl.setView(decorView,layoutParams, parentView)

-->ViewRootImpl.requestLayout()-->scheduleTraversals()-->doTraversal()-->performTraversals()

```

* 绘制三大步骤

```

测量:ViewRootImpl.performMeasure

布局:ViewRootImpl.performLayout

绘制:ViewRootImpl.performDraw

```

如下图所示

![](https://img.kancloud.cn/e1/29/e1298492c94464099195db1ad5916bc7_1235x944.png)

#### **Viewde测量**——确定DecroView的MeasureSpec

* DecroView的MeasureSpec由窗口大小和自身LayoutParams决定,遵守如下规则:

1. LayoutParams.match_parent:精确模式,窗口大小

2. LayoutParams.wrap_content:最大模式,最大为窗口大小

3. 固定大小:精确模式,大小为LayoutParams的大小

#### **View的布局**

* 调用view.layout确定自身的位置,即确定mLeft,mTop,mRight,mBottom的值

* 如果是ViewGroup类型,需要调用onLayout确定子View的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值