View工作原理之工作流程

View的工作流程(宏观)

View的绘制流程从ViewRootImpl的performTraversals方法开始的,它经过measure、layout和draw三个过程才能最终将一个View绘制出来,其中measure用来测量View的宽和高,layout用来确定View在父容器中的放置位置,而draw则负责将View绘制在屏幕上。

View的工作流程(中观)

performTranversals的工作流程图

对上面的图进一步理解,performTraversals会依次调用performMeasure、performLayout和performDraw三个方法,这三个方法分别完成顶级View的measure、layout和draw这三大流程,其中在performMeasure中会调用measure方法,在measure方法中又会调用onMeasure方法,在onMeasure方法中,则会对自己本身和所有的子元素进行measure过程,这个时候measure流程就从父容器传递到子元素中了,这样就完成一次measure过程。接着子元素会重复父容器的measure过程,如此反复就完成了整个View树的遍历。
同理,performLayout和performDraw的传递流程和performMeasure是类似的,唯一不同的是,performDraw的传递过程是在draw方法中通过dispatchDraw来实现的,不过这并没有本质区别。(注意在Android-26,并没发现dispatchDraw,而是drawSoftware)

  • measure过程决定了View的测量宽高,Measure完成以后,可以通过getMeasuredWidth和getMeasuredHeight方法来获取到View测量后的宽高,在几乎所有情况下它都等同于View的最终的宽高,但是特殊情况除外(待补充)。
  • layout过程决定了,View的四个顶点的坐标和实际的View宽高,完成以后,可以通过getTop、getBottom、getLeft和getRight来拿到View的四个顶点和位置,并可以通过getWidth和getHeight方法来拿到View的最终宽高。
  • Draw过程则决定了View的显示,只有draw方法完成以后View的内容才能呈现在屏幕上

本节主要(从中观)说明了,视图树从开头到结尾以及从父容器到子容器的整个传递过程。

View的工作流程(微观)

View的绘制流程(详细微观图)

你可能感兴趣的:(View工作原理之工作流程)