requestLayout、invalidate、postInvalidate
當 View 呼叫 requestLayout() 時會設定一個標識: mPrivateFlags |= PFLAG_FORCE_LAYOUT
,然後呼叫父 View 的 requestLayout() 並設定標識,直到 ViewRootImpl 的 requestLayout()。
在 ViewRootImpl 的 requestLayout() 中非同步呼叫了 performTraversals(),然後分別呼叫了 performMeasure()、performLayout()、performDraw()。
在 performMeasure() 中會呼叫 View 的 measure(),檢查 PFLAG_FORCE_LAYOUT
標識,然後執行 onMeasure(),最後設定 PFLAG_LAYOUT_REQUIRED
標識。
在 performLayout() 中會呼叫 View 的 layout(),檢查 PFLAG_LAYOUT_REQUIRED
標識,然後執行 onLayout(),最後清除標識。
在 performDraw() 中會呼叫 View 的 draw(),然後執行 onDraw()。
invalidate
當 View 呼叫 invalidate() 時會設定一個標識: mPrivateFlags |= PFLAG_DIRTY
,然後呼叫父 View 的 invalidateChild() 並設定標識,直到 ViewRootImpl 的 invalidateChild()。
在 ViewRootImpl 的 invalidateChild() 中非同步呼叫了 performTraversals(),然後分別呼叫了 performMeasure()、performLayout()、performDraw()。
在 performMeasure() 中會呼叫 View 的 measure(),檢查 PFLAG_FORCE_LAYOUT
標識不通過,不會執行 onMeasure()。
在 performLayout() 中會呼叫 View 的 layout(),檢查 PFLAG_LAYOUT_REQUIRED
標識不通過,不會執行 onLayout()。
在 performDraw() 中會呼叫 View 的 draw(),然後執行 onDraw()。
postInvalidate
當 View 呼叫 postInvalidate() 時會在 ViewRootImpl 中通過 Handler 切換到主執行緒呼叫 View 的 invalidate()。