View的刷新机制

在Android 布局体系种,父 View 负责刷新,子 View 负责布局展示。子View 如果要刷新,需要通知父View 来完成。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//invalidate 最终调用到这里
void invalidateInternal(int l, int t, int r, int b, boolean invalidateCache,
boolean fullInvalidate) {
....
//这里特殊注意下这个 AttachInfo
final AttachInfo ai = mAttachInfo;
//得到父控件
final ViewParent p = mParent;
if (p != null && ai != null && l < r && t < b) {
//将attachInfo 信息保存在damage 中
final Rect damage = ai.mTmpInvalRect;
damage.set(l, t, r, b);
//父 View--> p 调用自身invalidateChild 方法刷新
p.invalidateChild(this, damage);
}
....
}
}

invalidate 中,调用父 ViewinvalidateChild , 这是一个由低向上回溯的过程,每一层的父 View 都将自己的显示区域与传入的刷新 Rect 做交集,一直向上追溯直到 ViewRoot 那里结束,由 ViewRoot 对这个最终的刷新区域做刷新。

1
2
3
public void invalidateChild(View child, Rect dirty) {
scheduleTraversals();
}
-------------本文结束感谢您的阅读-------------