本文将主要介绍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相关。

最新文章

  1. P1905生活大爆炸版 石头剪刀布
  2. view保存为图片
  3. IOS第三天
  4. 使用 AFNetworking 进行 XML 和 JSON 数据请求
  5. 【HDU 5115】Dire Wolf
  6. CheckBoxList1复选框
  7. CC150 - 11.5
  8. C#线程
  9. Java [Leetcode 96]Unique Binary Search Trees
  10. Unity之坐标转换
  11. 让Dock自动 显示/隐藏 不再有延迟
  12. [转载]Jquery Form插件表单参数
  13. linux 查看外网IP
  14. uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)
  15. Task线程 同时执行多个任务
  16. Digital Tutors - Creating an Action Adventure Puzzle in Unity学习笔记
  17. 最新的 cocoapods 安装与使用(2019.04)
  18. 浅析toString()和toLocaleString()的区别
  19. python之count()函数
  20. Jquery 只保留数字和小数点(正则)

热门文章

  1. Tree - Rooted Trees
  2. 【转】java.lang.ClassNotFoundException: org.springframework.context.event.GenericApplicationListener
  3. centos7生成密钥及集群之间免密登录
  4. 使用@Aspect切面进行让JDBC自动关闭(Spring AOP)
  5. 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如str为abca时,输出则为abcabca
  6. 《Inetnet History,Technology and Security》学习笔记
  7. File常见操作函数
  8. Flask—10-项目部署(02)
  9. redhat6本地源NBD驱动安装
  10. iOS 杂笔-26(苹果禁用热更新)