UI绘制流程

https://www.jianshu.com/writer#/notebooks/14045782/notes/14163616 这篇文章 描述了window的添加过程,这篇继续描述UI的绘制流程

ViewRootImpl 的performTraversals()方法中,分别调用了performMessure,performLayout,performDraw 三个方法,对应我们自定义UI时的最重要的三个方法,onMeassure(), onLayout(),onDraw() 三个方法,开启了DecorView的绘制流程。

  1. performMeasure


    UI绘制流程_第2张图片
    image.png

    在performMeasure方法中,可以看到,调用了mView.measure方法,这个mView就是decorView,将款和高的MeasureSpec信息传入。
    先说一下MeasureSpec的作用,在Measure流程中,系统将View的LayoutParams根据父容器所施加的规则转换成对应的MeasureSpec,通过MeasureSpec来进行统一的测量。

UI绘制流程_第3张图片
image.png

在measure方法中,又调用了onMeasure方法,进入了View的onMeasure方法中。进入了测量

2.performLayout


UI绘制流程_第4张图片
image.png

performLayout 方法中,调用了host.layout方法, host的赋值是mView,和performMeasure一样,这个View是decorView,将decorView摆放到屏幕中。

UI绘制流程_第5张图片
image.png

在host.layout方法中,又调用了onLayout方法,将整个Layout的过程交给了onLayout。
3.performDraw


UI绘制流程_第6张图片
image.png

performDraw调用了draw方法法。


UI绘制流程_第7张图片
image.png

draw方法中又调用了 mAttachInfo.mTreeObserver.dispatchOnDraw();
UI绘制流程_第8张图片
image.png

dispatchOnDraw方法又调用了onDraw()进行了绘制。

注意:在自定义viewGroup的时候,如果想拿到margin,要先复写了generateLayoutParams方法。

你可能感兴趣的:(UI绘制流程)