Android UI 管理系统层级关系
其中PhoneWindow 是android 系统中最基本的窗口系统,每个Activity 都会创建一个。PhoneWindow 是 Activity和View系统交互的接口。
DecorView 本质上是一个FramLayout,是Activity中所有View 的祖先。
A、绘制的整体流程
注:绘制会从根视图ViewRoot 的 performTraversals()方法开始,从上到下遍历整个视图树,
每个View控件负责绘制自己,而ViewGroup还需要负责通知自己的子view进行绘制操作。
视图绘制的三个步骤:分别是测量(Measure)、布局(Layout)、绘制(Draw).
在源码中performTraversals()方法
//执行测量流程
performMeasure()
//执行布局流程
performLayout
//执行绘制流程
performDraw();
B、MeasureSpec
MeasureSpec 表示的是一个32位的整型值,他的高2位表示测量模式SpecMode,低30位表示某种测量模式下的规格大小SpecSize.MeasureSepc是View 类的一个静态内部类,用来说明应该如何测量
源码:中测量模式
C、Measure
Measure 操作用来计算view的实际大小,由前面的分析可知,页面的测量流程是从performMeasure方法开始的,核心代码:
/**childWidthMeasureSpec 宽量规范
* childHeightMeadureSpec 高的测量规范
*/
private void performMeasure(int childWidthMeasureSpec,int childHeightMeadureSpec){
...
mView.measure(childWidthMeasureSpec,childHeightMeadureSpec);
...
}
可以看到,具体测量是分给ViewGroup的。由ViewGroup在他的measureChild方法中传递给子view,代码如下:
ViewGroup通过遍历自身中所有的子view ,并逐个调用子view
/**绘制分为6个步骤*/
//第一步:绘制view 背景
drawBackground(00);
//第二部 ,如果取药的话,保存canvas的图层,为fading做准备
canvas.getSaveCount();
canvas.saveLayerAlpha(0,0,0,0,null,0);
//第三步:绘制View内容
draw(canvas);
//第三四:绘制View的子View
dispatchDraw(canvas);
//第五步 :如果有需要的话,绘制View 的fading 边缘并恢复图层
//canvas.drawRect(left,top,right,bootom,p);
canvas.restoreToCount(saveCount);
//第六步:绘制View的装饰
onDrawScrollBars(canvas);