ViewRoot和DecorView
在ActivityThread创建Activity以后,会将顶级View DecorView添加到Window中,同时创建ViewRootImpl对象RootView和DecorView关联。RootView的perfromTravelsals方法对View进行绘制,经过measure、layout、draw将View绘制出来,其中measure方法用来测量View的宽和高,layout用来确定View在父容器中的布局,draw将View显示在屏幕上。
1.png
performRravelsals方法会依次调用performMeasure、preformLayout和performDraw方法,这三个方法完成对顶级View DecorView的绘制,而performMeasure又调用measure方法,measure方法继续调用子元素的measure方法依次完成View树的遍历,其他两个方法类似。
理解MeasureSpec
在测量过程中,系统会将View的LayoutParams根据父容器所施加的规则转换成MeasureSpec,然后再根据这个MeasureSpec测量出View的宽和高。顶级View DecorView和普通View的测量过程也不太,顶级View由LayoutParams和窗口大小共同决定MeasureSpec,普通View由LayoutParams和父容器所施加的规则共同决定MeasureSpec,MeasureSpec一旦确定,onMeasure方法就可以确定View的宽和高了。
measure过程
如果是原始的View,则调用measure方法就完成了测量过程,如果是ViewGroup,出了完成自己的measure过程,还需要遍历子元素的measure方法。
layout过程
layout方法步骤是,首先通过setFrame方法设定View四个顶点的位置,这样就确定了View在父容器中的位置,然后再调用onLayout方法确定子元素的位置。
draw过程
绘制背景、绘制自己、绘制子元素(通过dispatchDraw方法遍历所有子元素的draw方法,如此draw事件就一层一层传递下去了)、绘制装饰。
源码如下:
2.png
网友评论