invalidate 与 requestLayout
先放结论:
- requestLayout 会直接递归调用 parent 的 requestLayout 方法,直到 ViewRootImpl ,然后触发 performTravesals ,由于 mLayoutRequested 为 true ,会导致 onMeasure 和 onLayout 被调用,不一定触发 onDraw 。
- requestLayout 在什么时候触发 onDraw 呢? 就是 layout 过程发现 左上右下 有变化,那就出发 invalidate (间接触发 onDraw),或者 其他原因导致 mDirty 不空 (比如在跑动画)
- invalidate 会递归调用 parent 的 invalidateChildInParent ,直到 ViewRootImpl 的 invalidateChildInParent ,然后也是触发 performTravesals, 由于 mLayoutRequested 为 false ,所以不会触发 onMeasure 和 onLayout ,而 onDraw 会调用
以上内容参考自CSDN上的博客