一、ViewRoot
1茅主、ViewRoot
對應于ViewRootImpl舞痰,鏈接WindowManager與DecorView的紐帶,View的三大流程均是通過ViewRoot完成诀姚。
在Activity創(chuàng)建完畢后响牛,會將DecorView添加到Window中,同時會創(chuàng)建ViewRootImpl對象赫段,并將ViewRootImpl對象和DecorView建立關聯(lián)呀打。
2、performTraversals
View的繪制流程是從ViewRoot的performTraversals開始糯笙,它經(jīng)過measure贬丛、layout和draw三個過程最終將View繪制出來。
performTraversals會依次調用performMeasure给涕、performLayout和performDraw三個方法豺憔,三個方法分別完成頂層View的measure、layout够庙、draw三大流程恭应。
performMeasure中調用measure方法,measure方法又會調用onMeasure方法耘眨,onMeasure中對所有子元素進行measure過程昼榛。
layout與draw流程相同。
performTraversals的調用時機
#ViewRootImpl.java
void doTraversal() {
if (mTraversalScheduled) {
mTraversalScheduled = false;
mHandler.getLooper().getQueue().removeSyncBarrier(mTraversalBarrier);
if (mProfile) {
Debug.startMethodTracing("ViewAncestor");
}
performTraversals();
if (mProfile) {
Debug.stopMethodTracing();
mProfile = false;
}
}
}
final class TraversalRunnable implements Runnable {
@Override
public void run() {
doTraversal();
}
}
final TraversalRunnable mTraversalRunnable = new TraversalRunnable();
void scheduleTraversals() {
if (!mTraversalScheduled) {
mTraversalScheduled = true;
mTraversalBarrier = mHandler.getLooper().getQueue().postSyncBarrier();
mChoreographer.postCallback(
Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null);
if (!mUnbufferedInputDispatch) {
scheduleConsumeBatchedInput();
}
notifyRendererOfFramePending();
pokeDrawLockIfNeeded();
}
}
通過調用scheduleTraversals方法執(zhí)行mTraversalRunnbale剔难,最后執(zhí)行doTraversal胆屿。performTraversals方法只有該執(zhí)行入口。