Android UI 是按照层级摆放的。这个层级包括系统元素,例如通知栏和导航栏等,还有现在的活动试图层级。当一个活动被带到前台,系统要求知道该活动的的根节点,然后要绘制显示屏上的视图层级。当你调用setContentView时需要设置活动的根结点。活动布局需要包括顶部通知栏和动作栏以及底部导航栏之间的所有东西。
显示屏被绘制的区域被标记为无效。任何与无效区域交互的东西都需要被重新绘制。当系统绘制一个活动时会调用invalidate(),但是你也可以通过在试图上调用invalidate()强制其发生。当试图被绘制好之后,它就被标记为有效(valid)。
绘制分为两个阶段。在第一阶段,层级的根节点被要求衡量自身。然后根节点会测量每个子视图。每个子视图随后又会测量它的子视图。这样,视图层级的每一视图的尺寸都被测量出来了。在每个一级别上,父视图都会给予子视图一个特定的尺寸或者会要求它们自己设置的尺寸。
当测量阶段结束后,系统会执行视图层级的布局。它会先序遍历布局树,把每个视图绘制到一个位图上。父视图首先绘制,然后在其上绘制子视图。布局完成之后,绘制系统会向屏幕绘制位图并把它们展示给用户。