android中Activity中的WindowManager与Window

在做项目的过程中,需要实现Activity非全屏显示、窗口背景透明显示的效果。

在实现这些功能的过程中,涉及到Window与WindowManager两个类,经过查一些相关资料,了解二者之间的不同点如下所示:

1)WindowManager继承自ViewManager这个接口,这个接口主要有以下的实现子接口:

       * addView();  
       * updateViewLayout(); 
       * removeView();

        在WindowManager中,addView方法表示的是将主窗口中的顶级view(也就是DecorView)添加到WindowManager中,并建立会话。

  WindowManager主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。

2)接下来会详细介绍。我们先来看看Window

  Window是android中的窗口,表示顶级窗口的意思,也就是主窗口,它有两个实现类,PhoneWindow和MidWindow,我们一般的 activity对应的主要是PhoneWindow,在activity中经常使用的setContentView等方法也是在这个里面实现的。

3)每个主窗口中都有一个View,称之为DecorView,是主窗口中的顶级view(实际上就是ViewGroup),在View中有两个成员变量叫做 mParent、mChildren,它是用来管理view的上下级关系的。而ViewGroup是对一组View的管理。因此,在ViewGroup中 建立了所有view的关系网。而最终ViewGroup附属在主窗口上。这样就很容易在窗口中通过findViewById找到具体的View了。 view中的事件处理也是根据这个路径来处理的。

 1 wm = (WindowManager)getSystemService("window");
 2          WindowManager.LayoutParams params = new WindowManager.LayoutParams();
 3          params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT | WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY;
 4          params.format = PixelFormat.TRANSPARENT;
 5          params.alpha = 0.0f;
 6          params.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
 7                  WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
 8          params.width = ConnTeckConstant.screenWidth  ;
 9          params.height = ConnTeckConstant.screenHeight ;
10          params.x = 0;
11          params.y = 0;
12          wm.addView(playView, params);  //此句非常关键,若没有此句,则窗口不会显示,即使在window接口中调用setContentView,也不会显示。params用于设置view所在顶级窗口的属性
13         
14          configSurface();
15          configSurface2();
16         
17          WindowManager.LayoutParams params2 = new WindowManager.LayoutParams();
18          params2.width =  params.width;
19          params2.height = params.height ;//此句用于自定义窗口大小,实现Activity窗口非全屏显示
20          params2.alpha = (float)0.0;//此句用于定义窗口透明显示
21         
22          window = this.getWindow();
23          window.setAttributes(params2);//params2用于设备整个Activity的窗口属性

4、浮动窗口实现

     窗口样式定义:

    

 1 wm=(WindowManager)getApplicationContext().getSystemService("window");
 2             //设置LayoutParams(全局变量)相关参数
 3             wmParams = ((MyApplication)getApplication()).getMywmParams();
 4 
 5              /**
 6              *以下都是WindowManager.LayoutParams的相关属性
 7              * 具体用途可参考SDK文档
 8              */
 9             wmParams.type=LayoutParams.TYPE_PHONE;   //设置window type
10             wmParams.format=PixelFormat.RGBA_8888;   //设置图片格式,效果为背景透明
11 
12             //设置Window flag
13             wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL
14                                   | LayoutParams.FLAG_NOT_FOCUSABLE;
15             /*
16              * 下面的flags属性的效果形同“锁定”。
17              * 悬浮窗不可触摸,不接受任何事件,同时不影响后面的事件响应。
18              wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL 
19                                    | LayoutParams.FLAG_NOT_FOCUSABLE
20                                    | LayoutParams.FLAG_NOT_TOUCHABLE;
21             */
22             
23             
24             wmParams.gravity=Gravity.LEFT|Gravity.TOP;   //调整悬浮窗口至左上角
25             //以屏幕左上角为原点,设置x、y初始值
26             wmParams.x=0;
27             wmParams.y=0;
28             
29             //设置悬浮窗口长宽数据
30             wmParams.width=40;
31             wmParams.height=40;
32         
33             //显示myFloatView图像
34             wm.addView(myFV, wmParams);

     这个浮动窗口的实现是其于一个完整的Activity中弹出一个浮动窗口实现的,若希望整个Activity本身就是一个浮动窗口,则需要修改Window的属性

 

    原文作者:ActivityManagerService
    原文地址: http://www.cnblogs.com/meizixiong/p/3546397.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞