多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
### 参考文章 [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的位置