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,併發起一次遍歷