调用invalidate方法,最终会调用自己的onDraw方法进行重绘
调用invalidate会调用view的invalidate
- 首先判断视图是否有效
- 然后再继续判断是否跳过重绘
- 最终会调用父类的invalidateChild(this, damage); 方法
关键方法
p.invalidateChild(this, damage);
就调用viewGroup的invalidateChild方法
不断调用
do {
parent = parent.invalidateChildInParent(location, dirty);
if (view != null) {
// Account for transform on current parent
Matrix m = view.getMatrix();
if (!m.isIdentity()) {
RectF boundingRect = attachInfo.mTmpTransformRect;
boundingRect.set(dirty);
m.mapRect(boundingRect);
dirty.set((int) Math.floor(boundingRect.left),
(int) Math.floor(boundingRect.top),
(int) Math.ceil(boundingRect.right),
(int) Math.ceil(boundingRect.bottom));
}
}
} while (parent != null);
不断的do while循环,直到循环到最外层view的invalidateChildInParent方法。
里面的parent是调用的ViewGroup的invalidateChildInParent方法
最外层是调用ViewRootImpl的invalidateChildInParent方法
ViewRootImpl类中invalidateChildInParent方法分析
invalidateChildInParent -> invalidateRectOnScreen -> scheduleTraversals -> postCallback/mTraversalRunnable -> doTraversal -> performTraversals
==在View的绘制流程中performTraversals方法是非常重要的==
- [ ] 测量
performMeasure
- [ ] 摆放
performLayout
- [ ] 绘制
performDraw
最后调用
mView.draw(canvas);
==mView是最外面的view,不是调用invalidate方法的那个view,
又调到view的ondraw中,有有了view的绘制流程==
invalidate流程
==一路往上跑,跑到顶层视图(最外层)调用draw方法,draw里面有dispatchDraw绘制children,一路往下画,最终画到当前调用invalidate方法的view的ondraw方法。==
invalidate是牵连着整个layout布局中的所有view