您的位置:首页 > 移动开发 > Android开发

Android 窗口机制

2016-05-21 16:33 232 查看
Android 窗口特点

   Android窗口是层叠式布局,顾名思义,它是可以允许多个窗口层叠显示。该布局一般需要一个窗口管理服务端,服务端采用的是共享库的方式来进行工作,这种方式一般用在嵌入式设备上,开销较小。层叠式的展示采用是z-order的规则,层级越大的越是在上面

Android 中到底什么是窗口?又与View有什么不同?

 View只是单纯的视图的展示,是一个可见的块。

  所有被WindowManagerService管理都是窗口,它有一个方法是addView(),添加的是View。所以在WmS来看,窗口就上一个View。但是不能说一个View是窗口

Android 窗口的分类

   1.应用窗口: 一般对应一个Activity ,层级值(0~99)

   2.子窗口:有一个父窗口,父窗口可以是任意类型, 层级值(1000~1999)

   3.系统窗口:不对应Activity,无父窗口,层级值(2000~2999)

   在层级中有一些具体的划分,比如某些层级值就是由操作系统固定的,具体有一个表格。表格可以见我在网上找的链接:

   http://blog.csdn.net/geloin/article/details/42779025

应用窗口

     这是最重要的也是用的最频繁的,因为它对应一个Activity,有Activity的地方就有它。

    在介绍这个时候不得不介绍一个类:Window,它是窗口的抽象,准确的说是应用窗口的抽象(在其它类型的窗口中并没有用到),这个类决定了窗口展示的位置大小,透明度等等一些东东!给这类举个用处,比如你弹出一个popupWindow后需要背景变成灰色的蒙版,你可以改变它的透明度

WindowManager.LayoutParams params=  this.getWindow().getAttributes();
params.alpha=1f;
this.getWindow().setAttributes(params);


有个特殊的地方是Dialog默认的类型是应用窗口,所以Dialog也有一个window对象。默认弹出的对话框是会出现黑色的蒙版,使得屏幕的其它地方变暗,我们可以通过设置来改变其默认的行为,下面是代码实现

WindowManager.LayoutParams a =  dialog.getWindow().getAttributes();
a.dimAmount = 0f;


多数情况下我们都使用了setContentView()这里对窗口进行了装饰


手动设置的过程只有中间的过程,当然,也可以通过设置主题等方式去掉上面的标题栏。可以通过ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT)获取到整个窗口填充的视图。ID_ANDROID_CONTENT正是id = content的FrameLayout

=========以下的更新补充=================

关于窗口有个很好的理解,就是4.4以后的沉浸式。

网上有个沉浸式的处理类SystemBarTintManager.java

它的做法就是获取到获取到状态栏窗口的的高度,然后设置一个一样高度视图,默认的应该是黑色或者白色(应该与主题相关)。我们看到以为状态栏与下面的Activity视图是一整块,其实不是的。

状态栏本身是一个窗口,它处于Activity所对应窗口的上面,而且应该状态栏应该有透明属性的。默认的Activity的窗口留出了上面的空间。可以通过DecorView来操作整个Activity所对应的窗口视图,将默认填充黑色的地方,改成其它的颜色。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android 窗口机制