Invalidate
只是让draw失效,不涉及measure、layout
forceLayout requestLayout
- forceLayout只是标记view,下次遍历一定measure,但是不发起遍历。
- requestLayout 标记一定measure后,还想父布局传递,发起一次遍历
public void forceLayout() {
if (mMeasureCache != null) mMeasureCache.clear();
mPrivateFlags |= PFLAG_FORCE_LAYOUT;
mPrivateFlags |= PFLAG_INVALIDATED;
}
public void requestLayout() {
if (mMeasureCache != null) mMeasureCache.clear();
...
mPrivateFlags |= PFLAG_FORCE_LAYOUT;
mPrivateFlags |= PFLAG_INVALIDATED;
if (mParent != null && !mParent.isLayoutRequested()) {
mParent.requestLayout();
}
...
}
总计
- invalidate 针对draw
- forceLayout 强制下一次遍历时,measure该view,但不知道什么时候遍历
- requestLayout,强制measure,并发起一次遍历