android

Android 图形系统(4)---- DecorView 和V

2022-09-29  本文已影响0人  特立独行的佩奇

Android UI的绘制显示流程

RenderFlow.jpg

DecorView简介

DecorView是FrameLayout的子类,是Android视图树的根节点视图,DecorView作为Top View,一般情况下它内部包含一个竖直方向的LinearLayout,这个LinearLayout包含两个部分,由上到下分别是:

ViewRoot 简介

ViewRoot对应ViewRootImpl类,它是连接WindowManagerService和DecorView的纽带,View的三大流程(测量(measure),布局(layout),绘制(draw))均通过ViewRoot来完成;
ViewRoot 本质上并不是一个View,并不是View 的子类和父类,但是它实现了ViewParent接口,这让它可以作为View的名义上的父视图;RootView继承了Handler类,可以接收事件并分发,Android的所有触屏事件、按键事件、界面刷新等事件都是通过ViewRoot进行分发的,下图可以表面ViewRoot 和 View 之间的逻辑关系


ViewRoot.jpg

DecorView 的创建流程

DecorView 的创建流程如下所示:


image.png

重要代码位置:
/framework/base/core/java/android/view
/frameworks/base/core/java/android/app/
/frameworks/base/core/java/com/android/internal/policy/PhoneWindow.java

  1. Acitvity.java 中的 attach函数中创建了PhoneWindow,Acitvity的主要功能是控制生命周期,Window里的逻辑用于提供图形生成能力并且装饰
  2. setContentView 是用于设置ContentView的布局,这里会先调用**LayoutInflater **解析布局文件生成各个不同View的实例

ViewRootImpl 的创建流程

ViewRootImpl 的创建流程如下所示:


ViewRootImpl.jpg
    private final ArrayList<View> mViews = new ArrayList<View>();
    private final ArrayList<ViewRootImpl> mRoots = new ArrayList<ViewRootImpl>();
    private final ArrayList<WindowManager.LayoutParams> mParams =
            new ArrayList<WindowManager.LayoutParams>();
    private final ArraySet<View> mDyingViews = new ArraySet<View>();
    public void addView(View view, ViewGroup.LayoutParams params,
            Display display, Window parentWindow) {
 synchronized (mLock) {
            // Start watching for system property changes.
            if (mSystemPropertyUpdater == null) {
                mSystemPropertyUpdater = new Runnable() {
                    @Override public void run() {
                        synchronized (mLock) {
                            for (int i = mRoots.size() - 1; i >= 0; --i) {
                                mRoots.get(i).loadSystemProperties();
                            }
                        }
                    }
                };
                SystemProperties.addChangeCallback(mSystemPropertyUpdater);
            }

            int index = findViewLocked(view, false);
            ...... 省略
            root = new ViewRootImpl(view.getContext(), display);
            view.setLayoutParams(wparams);

            mViews.add(view);
            mRoots.add(root);
            mParams.add(wparams);

            // do this last because it fires off messages to start doing things
            try {
                root.setView(view, wparams, panelParentView);
            } catch (RuntimeException e) {
                // BadTokenException or InvalidDisplayException, clean up.
                if (index >= 0) {
                    removeViewLocked(index, true);
                }
                throw e;
            }
        }
}
上一篇 下一篇

猜你喜欢

热点阅读