转载地址:https://juejin.cn/post/7100121390090551332
背景
Invalidate()
是 Android
中 View
的方法,通常我们使用它来完成UI
的刷新,
作用
如果这个 View
可见那么 onDraw()
方法将在未来某个时间点被调用。
问题
invalidate()
会触发那些 view
的重绘,invalidate()
绘制流程是如何实现的?
我们带着问题来从源码开始分析:
源码分析
一、View 与 ViewGroup 的层级
在 Android
中 View
是以树形结构组织的,下图相信大家都不陌生,那么我们调用红色View的 invalidate()
会发生什么?
1.1 View.invalidate()
方法入口:
public void invalidate() {
invalidate(true);
}
参数:
l,t,r,b
是 View 的大小invalidateCache
: 设置 View 的缓存是否失效,通常情况下是ture
, 当View
的大小改变时为false
fullInvalidate
: 默认为true
void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache,
boolean fullInvalidate) {
...
final AttachInfo ai = mAttachInfo;
// 改 View 的父布局
final ViewParent p = mParent;
if (p != null && ai != null && l < r && t < b) {
// 记录需要绘制的范围 damge ,该区域为 View 尺寸
final Rect damage = ai.mTmpInvalRect;
damage.set(l, t, r, b);
// 调用父布局的 invalidateChild()