ViewRoot与DecorView

一、ViewRoot

1、ViewRoot
对应于ViewRootImpl,链接WindowManager与DecorView的纽带,View的三大流程均是通过ViewRoot完成。
在Activity创建完毕后,会将DecorView添加到Window中,同时会创建ViewRootImpl对象,并将ViewRootImpl对象和DecorView建立关联。

2、performTraversals
View的绘制流程是从ViewRoot的performTraversals开始,它经过measure、layout和draw三个过程最终将View绘制出来。

performTraversals调用流程

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方法只有该执行入口。

你可能感兴趣的:(ViewRoot与DecorView)