#.概述
##.PhoneWindow中的DecorView是根布局
Android中Window是显示和管理View的载体,其实现类是PhoneWindow。所有View是按照树的逻辑结构来管理的,父View有多个子View节点,子View节点又可以有多个View节点。而这棵View树的根节点是PhoneWindow中的根布局,一个DecorView,DecorView由两部分构成:ActionBar(操作条区域,顶部用于显示标题和几个操作按钮的区域)contentParent(内容区域)。其中actionBar可根据需要来设置,不一定总是有。用户自己自己写的界面最终可通过PhoneWindow.setContentView()方法添加到内容区域。
##.显示流程概述
View的正常显示流程分三大步骤:(这里的View泛指ViewGrop和非ViewGrop的View)1.测量阶段:计算View自身的长、宽大小,并触发各个子View的测量过程;2.布局阶段: 计算View在父布局中的位置(即其在父布局中的上下左右坐标),并触发各个子View的布局过程;3.绘制阶段:将 View绘制在屏幕上,并触发各个子View的绘制过程;其中,每个过程都是自顶向下递归进行的:父View处理完自己的本阶段流程,然后会循环遍历调用子View的本阶段流程;子View处理完自己的本阶段路程后,又会继续循环遍历调用它的子View本阶段流程;…….不断重复该流程…….直到View树中每个节点都被处理完。ViewRoot,实现类为ViewRootImpl,是连接WindowManager和DecorView的纽带,以上三个过程在最初始都是由ViewRoot来发起的。
#.具体流程
三个流程的链条如上图所示,最初由ViewRoot的performTraversals()方法来依次触发顶层View(DecorView)的performMeasure()、performLayout()、performDraw()方法,然后沿着View树结构自顶向下,依次递归传递下去。
##.measure(测量)阶段的传递链条
ViewRoot根据PhoneWindow尺寸和DecorView的LayoutParams信息,计算出顶层作为顶层View的DecorView的宽高MeasureSpec信息,通过performTraversals(【宽高的MeasureSpec测量信息】)来触发其 measure(【宽高的MeasureSpec测量信息】):
(位于View树顶层的DecorView)触发顶层View(即DecorView)的 onMeasure(【宽高的MeasureSpec测量信息】) :——> 设置自身的测量尺寸宽高:最终是通过setMeasuredDimension(【宽高】)等方法来设置;——>根据自身的宽高MeasureSpec信息 和 子View的LayoutParams,计算出子View的宽高MeasureSpec信息——>遍历调用子View的 measure(【宽高的MeasureSpec测量信息】)(位于View树中间层的ViewGroup)触发下一层父ViewGroup的 onMeasure(【宽高的MeasureSpec信息】) :——> 设置自身的测量尺寸宽高:最终是通过setMeasuredDimension(【宽高】)等方法来设置;——>根据自身的宽高MeasureSpec信息 和 子View的LayoutParams,计算出子View的宽高MeasureSpec信息——>遍历调用子View的 measure(【宽高的MeasureSpec测量信息】)…………………………不断递归重复该过程