美文网首页
ViewRoot与DecorView

ViewRoot与DecorView

作者: 神棄丶Aria | 来源:发表于2020-05-02 11:16 被阅读0次

    一、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

          本文链接:https://www.haomeiwen.com/subject/hqzhghtx.html