zoukankan      html  css  js  c++  java
  • android分析windowManager、window、viewGroup之间关系(一)

       本文将主要介绍addview方法,在windowManager、window、viewGroup中的实现原理。首先将介绍这些类结构关系,然后分析其内在联系,介绍实现原理,最后介绍重要的一个参数windowManager.layoutParams。

    文章预计分为三个部分。

      一、首先介绍一下上述接口、类的结构

      接口:windowManager

        用来在应用与window之间的管理接口,管理窗口顺序,消息等

    public interface WindowManager extends android.view.ViewManager

         抽象类:window

        定义窗口样式和行为的抽象基类,用于作为顶层的view加到windowManager中。

        唯一实现了这个抽象类的是PhoneWindow,实例化PhoneWindow需要一个窗口

        public abstract class Window

        其中有一个很重要的内部类

        private class LocalWindowManager extends WindowManagerImpl.CompatModeWrapper{...};

      

      抽象类:viewGroup

        包含其他view的容器,layouts和view 容器的基类。

        public abstract class ViewGroup extends View implements ViewParent, ViewManager

      

      相关接口:ViewParent

            定义了一个view parent 的要负责的功能以及view和parent view之间的关联

        public interface ViewParent {

             public void requestLayout();

            public void createContextMenu(ContextMenu menu);

            public void bringChildToFront(View child);

            .....

        }

        viewManager

          用来添加和移除activity中的view的接口

    public interface ViewManager
    {
        public void addView(View view, ViewGroup.LayoutParams params);
        public void updateViewLayout(View view, ViewGroup.LayoutParams params);
        public void removeView(View view);
    }

     

    二.他们之间的内在关系。

      1. 对于view来说,添加到viewGroup中是通过addView();方式来实现的,在addView中实际上使用的是:

                addViewInner(child, index, params, false);

               流程是: 1.首先是对子View是否已经包含到一个父容器中

                    2.对子View布局参数的处理

                    3.调用addInArray来添加View

                    4.设置父View为当前的ViewGroup

                    5.焦点的处理

                    6.当前View的AttachInfo信息

                    7.View树改变的监听

                    8.子View中的mViewFlags的设置

                                 主要是通过    addInArray添加view,添加的实现为system.arrayCopy(....);

      

      2. 对于viewGroup来说,都会显示在在一个窗口中,每个都有一个父节点mParent,,最顶上的节点也是一个viewGroup,也就是decorView。

      对于每个activity只有一个decorView也就是ViewRoot,只有一个window,window的获取是通过下面方法获取的。

     Window mWindow = PolicyManager.makeNewWindow(this);
    

      在activity中使用setContentView(),其实是使用了 window.setContentView()完成的,window.setcontentView,

      还是通过LocalWindowManager.addView(view, params)来实现的。这里LocalWindowManager是实现了WindowManagerImpl.CompatModeWrapper

      ,本质上就是WindowManager、viewManager接口中的addvidew方法。

      

      3.  对于windowManager来说一个系统只有一个,它是由系统底层实现的,用于负责调度当前显示那个窗口,消息处理我们获得一个windowManager的方式如下:

      

    WindowManager windowManager = (WindowManager)context().getSystemService(
    									Context.WINDOW_SERVICE);
     
    

      这里windowManager其实是一个接口,而通过getSystemService的方式。通过这个方式可以获取很多的系统服务,比如电话、闹钟、电源管理等等。

      同时windowManager和几个类之间的内在联系如下:

     

    本节结束,下节讲述windowManager中WindowManager.layoutParams相关。

  • 相关阅读:
    Nginx简单认识
    Redis简单入门认识
    用户体验报告——脉脉
    zine结构图
    猫眼电影原型图
    关于共享单车的一点思考
    用户体验报告——网易严选
    Zine和石墨文档竞品分析
    用户体验报告——石墨文档
    集合框架2
  • 原文地址:https://www.cnblogs.com/xilinch/p/3361665.html
Copyright © 2011-2022 走看看