requestLayout、invalidate、postInvalidate

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()。

坚持原创技术分享,您的支持将鼓励我继续创作!