Window相关

1、ViewRootImpl的数量

android中Window.java的唯一实现类是PhoneWindow.java,WindowManager.java的实现类是WindowManagerImpl.java,WindowManagerImpl.java中的WindowManagerGlobal用于具体操作View。WindowManagerGlobal.java添加View时会调用ViewRootImpl的setView(view, wparams, panelParentView, userId)方法,在setView方法中调用requestLayout()从而进行view的测量、布局和绘制工作。

WindowManagerGlobal.java中有三个集合mViews(保存DecorView)、mRoots(保存ViewRootImpl) 、mParams (保存WindowManager.LayoutParams)

    WindowManagerGlobal.java
    @UnsupportedAppUsage
    private final ArrayList<View> mViews = new ArrayList<View>();
    @UnsupportedAppUsage
    private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
    @UnsupportedAppUsage
    private final ArrayList<WindowManager.LayoutParams> mParams =
            new ArrayList<WindowManager.LayoutParams>();

上面三个WindowManagerGlobal.java的addView方法中添加元素,addView方法是由ActivityThread.java的handleResumeActivity方法或者Activity.java的makeVisible方法调用调用。ViewRootImpl的数量等于WindowManagerGlobal.java的addView方法被调用的次数。

2、requestLayout和invalidate区别

view的requestLayout()方法最终会调用到ViewRootImpl的requestLayout()方法,接着会调用scheduleTraversals() ->mChoreographer.postCallback(

Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); ->doTraversal()从而执行测量、布局和绘制。

view的invalidate方法会调用ViewRootImpl的invalidateChildInParent方法,最终也会调用scheduleTraversals()->mChoreographer.postCallback(

Choreographer.CALLBACK_TRAVERSAL, mTraversalRunnable, null); ->doTraversal(),区别是没有设置mLayoutRequested = true

猜你喜欢

转载自blog.csdn.net/u013795543/article/details/114851277
今日推荐