7.1.4 控件的丈量和绘制
界面中的控件对象从构造完成至呈现到用户面前,还需要经历两个阶段,分别是控件尺寸丈量和控件对象绘制。
控件的丈量和绘制都是自上而下进行的,由控件树的根控件发起,逐步向下推进。各个控件对象的尺寸确定,大致包含两个阶段。首先,是从父控件开始向下调用View.measure函数,父控件会将其尺寸限制通知给子控件,子控件结合自己需要的尺寸信息,就可以推算出真实需要的控件尺寸大小。比如,父控件的宽度是300像素,子控件的宽度设定是View.FILL_PARENT(占据整个宽度),那么,子控件就可以推断出自己实际能够占据的空间为300像素。而在这个丈量过程中,如果父控件的尺寸不确定(比如,宽度是View.MATCH_CONTENT),它也可以根据计算出的子控件尺寸大小,反向推断出自己所需的尺寸大小。
紧接着,当控件明确预期的尺寸后,会重新从根控件开始,向下依次调用View.layout函数来设置各个控件对象的最终位置和实际大小。
由于子控件实际能够占据的区域局限在父控件区域的内部(也就是求交后的区域),此时,控件对象就可以遍历整棵控件树,在控件区域内依次绘制各个控件。绘制时,View.onDraw函数会被调用,控件对象可以在该函数中呈现包含的内容。
当控件对象的尺寸或内容发生变化时,可以调用View.requestLayout或View.invalidate函数,以驱动控件树的重新丈量和绘制。