UI绘制流程

QQ20190225-081715@2x.png

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

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

  1. performMeasure


    image.png

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

image.png

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

2.performLayout


image.png

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

image.png

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


image.png

performDraw调用了draw方法法。


image.png

draw方法中又调用了 mAttachInfo.mTreeObserver.dispatchOnDraw();
image.png

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容