Android View的绘制流程-总结

724 阅读2分钟

「这是我参与2022首次更文挑战的第17天,活动详情查看:2022首次更文挑战

相关文章:
Android View的绘制流程(一)-绘制流程以及Activity视图介绍
Android View的绘制流程(二)-Activity视图-DecorView
Android View的绘制流程(三)-Activity视图-WindowManager
Android View的绘制流程(四)-Activity视图-ViewRootImpl
Android View的绘制流程(五)-Measure
Android View的绘制流程(六)-Layout
Android View的绘制流程(七)-Draw

上一篇文章把Android View的绘制流程最后一个流程(Draw)介绍完了,流程和前面介绍的measure以及layout的绘制流程差不多,到此,我们把View的绘制流程全部都介绍完了,回顾整个内容,首先我们介绍了以Activity为例,对创建Activity之后的视图绘制作了分析,分别介绍了DecorView,Window,WindowManage以及负责绘制的ViewRootImpl,最后介绍了,绘制的三个步骤,measure,layout和draw,大部分通过源码分析,也介绍了开发过程中可能的踩坑点,下面我们把整个绘制流程做简单总结。

绘制流程

view在绘制过程中,会不停的找自己的父类,一直可以到DecorView,但是DecorView还有个虚拟的父类,就是ViewRootImpl,ViewRootImpl通过查看源码可以发现,它既不是一个View也不是一个ViewGroup,但是它有DecorView的这个成员变量的mView,所有的操作从 ViewRootImpl 开始自上而下分发。

View 的 invalidate

view 的 invalidate 不会导致 ViewRootImpl 的 invalidate 被调用,而是递归调用父 view的invalidateChildInParent,直到 ViewRootImpl 的 invalidateChildInParent,然后触发peformTraversals,会导致当前 view 被重绘,由于 mLayoutRequested 为 false,不会导致 onMeasure 和 onLayout 被调用,而 OnDraw 会被调用。

View 的requestLayout

View 的 invalidate只会执行onDraw,但是View 的requestLayout方法会执行onMeasure 和 onLayout,如果改变了View的大小,想重新绘制,就需要调用View的requestLayout(),但是不一定会执行OnDraw方法。 requestLayout 触发 onDraw 可能是因为在在 layout 过程中发现 l, t, r, b 和以前不一样,那就会触发一次 invalidate,所以触发了onDraw,也可能是因为别的原因导致 mDirty 非空(比如在跑动画), requestLayout 会导致自己以及父族 view 的 PFLAG_FORCE_LAYOUT和PFLAG_INVALIDATED 标志被设置。

一般来说,只要刷新的时候就调用 invalidate,需要重新 measure 就调用 requestLayout,后面再跟个 invalidate(为了保证重绘)

最后把View的绘制流程以流程图的形式总结如下:

image.png

到这里View的绘制流程已经介绍完了,接下来就介绍下View的事件分发。欢迎留言评论