View的三大方法——简介
一个View要想显示到界面上通常需要经历三个步骤:
- Measure 测量View,要想显示出一个View必须知道它的大小。
- Layout 布局View,要想显示出一个View,至少要知道它要在哪显示。
- Draw 绘制View,绘制完成后,我吗就可以看到这个View了。
这三个步骤是依次进行的,不可对调,因为View的位置也并不是一个点,而是一个矩形,是矩形就会有宽和高,所以如果我们在不知道View的大小的时候,也根本无法计算它所在的位置。
这三个方法都已经是android系统写好了的逻辑,中measure和layout都是final的,无法复写。虽然draw不是final的,但是也不建议复写该方法。但是如果我们想实现自身的逻辑,而又不破坏View的工作流程,可以重写这三个方法:onMeasure(),onLayout(),onDraw()。
如何发起一个View树的测量/布局/绘制流程
- 通过调用requestLayout()或者requestFocus()方法都将发起一个View树的测量,测量完毕后进行布局,布局完成后进行绘制(从View树的最上层到最下层)。
- 如果View的大小和布局都没有发生改变,仅仅是显示内容发生了变化,则可以调用invalidate()方法来请求绘制,该方法不会请求测量和布局,直接从绘制开始。
注意:窗口第一次可见的时候是从上往下开始绘制的,其他任何时候的绘制过程都是从下往上请求过去的。
测量/布局/绘制流程
decorView首先被ViewRoot调用了measure()进行测量,这个方法中会循环遍历自己所有的子view,调用子view的measure()进行测量,所有的子view最后都测量完了。decorView的measure()方法就执行完毕了。接着decorView判断是否需要layout(本次测量结果会和上次测量结果进行比对,宽高相同跳过),大小有改变,调用layout()重新布局,一旦布局发生了改变,绝对会调用draw()。