当Activity获得焦点时,它将被要求绘制自己的布局。每一个ViewGroup负责要求它的每一个孩子被绘制,每一个View负责绘制自己。
绘制是一个两遍的过程:一个measure pass和一个layoutpass
- 测量过程measure pass是在measure(int,int)中实现的,从树的顶端由上到下进行的。
在这个递归过程中,每一个View都把自己的dimension specifications传递下去。
在measure pass的最后,每一个View都存储好了自己的measurements,即测量结果。
- 布局过程layout pass,它发生在layout(int,int)中,仍然是从上到下进行。
在这一遍中,每一个parent都负责用测量过程中得到的尺寸,把自己的所有孩子放在正确的位置。
onMeasure()方法:
onMeasure方法是测量view和它的内容,决定width和height的,这个方法由measure(int,int)方法唤起,子类可以覆写onMeasure来提供更加精确和有效的测量。
onMeasure方法的声明如下:
protectedvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec)
其中有两个输入参数widthMeasureSpec,heightMeasureSpec
分别是parent提出的水平和垂直的空间要求。
onLayout()方法:
这个方法是在layout pass中被调用的,用于确定View的摆放位置和大小。
protectedvoid onLayout(boolean changed,int left,int top,int right,int bottom)
其中的上下左右参数都是相对于parent的。
如果View含有child,那么onLayout中需要对每一个child进行布局。
scrollTo()方法:
scrollTo(intx,int y)是将View中内容滑动到相应的位置,参考的坐标系原点是parent View的左上角。
x,y分别为X轴、Y轴上的坐标。
若函数中的参数为负值,则子View中的移动方向将相反。