### 参考文章
[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的位置