一、ViewRoot
1、ViewRoot
对应于ViewRootImpl,链接WindowManager与DecorView的纽带,View的三大流程均是通过ViewRoot完成。
在Activity创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。
2、performTraversals
View的绘制流程是从ViewRoot的performTraversals开始,它经过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方法执行mTraversalRunnbale,最后执行doTraversal。performTraversals方法只有该执行入口。
网友评论