文章目录
- 一、自定义View执行invalidate()方法为什么有时候不会回调onDraw()?
-
- 1.1 invalidate 软件绘制流程
- 1.2 invalidate源码分析
-
- 1.2.1 skipInvalidate()方法
- 1.2.2 invalidateChild方法
-
- 1.2.2.1 硬件加速绘制
- 1.2.2.2 软件刷新
- 1.2.3 小结
一、自定义View执行invalidate()方法为什么有时候不会回调onDraw()?
首先我们分析一下invalidate()
的执行流程,源码是如何从invalidate
调用到onDraw()
的。由于这部分代码相对较为复杂,那么请大家参考下面的时序图。
1.1 invalidate 软件绘制流程
invalidate 软件绘制流程
如下所示:
从上面的流程不难发现:
-
view
的invalidate
会逐层找parent
一直找到DecorView
,DecorView
是顶层view
,它有个虚拟父view
为ViewRootImpl
。ViewRootImpl
不是一个View
或者ViewGroup
,它的成员mView
就是DecorView
,然后再由ViewRootImpl
将所有的操作从ViewRootImpl
自上而下开始分发,最终分发给所有的View
。 -
View
的