requestLayout、invalidate、postInvalidate 的分析
requestLayout
当 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()。