調(diào)用invalidate方法狱从,最終會(huì)調(diào)用自己的onDraw方法進(jìn)行重繪
調(diào)用invalidate會(huì)調(diào)用view的invalidate
- 首先判斷視圖是否有效
- 然后再繼續(xù)判斷是否跳過(guò)重繪
- 最終會(huì)調(diào)用父類的invalidateChild(this, damage); 方法
關(guān)鍵方法
p.invalidateChild(this, damage);
就調(diào)用viewGroup的invalidateChild方法
不斷調(diào)用
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循環(huán)赴恨,直到循環(huán)到最外層view的invalidateChildInParent方法。
里面的parent是調(diào)用的ViewGroup的invalidateChildInParent方法
最外層是調(diào)用ViewRootImpl的invalidateChildInParent方法
ViewRootImpl類中invalidateChildInParent方法分析
invalidateChildInParent -> invalidateRectOnScreen -> scheduleTraversals -> postCallback/mTraversalRunnable -> doTraversal -> performTraversals
==在View的繪制流程中performTraversals方法是非常重要的==
- [ ] 測(cè)量
performMeasure
- [ ] 擺放
performLayout
- [ ] 繪制
performDraw
最后調(diào)用
mView.draw(canvas);
==mView是最外面的view抡草,不是調(diào)用invalidate方法的那個(gè)view恍涂,
又調(diào)到view的ondraw中哑舒,有有了view的繪制流程==
invalidate流程
==一路往上跑锅知,跑到頂層視圖(最外層)調(diào)用draw方法播急,draw里面有dispatchDraw繪制children,一路往下畫售睹,最終畫到當(dāng)前調(diào)用invalidate方法的view的ondraw方法桩警。==
invalidate是牽連著整個(gè)layout布局中的所有view