zoukankan      html  css  js  c++  java
  • 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的属性

  • 相关阅读:
    Validation failed for one or more entities
    sql 存储过程
    SQL Server分页3种方案比拼
    case when 用法
    C#如何计算代码执行时间
    透过 Jet.OLEDB 读取 Excel里面的数据
    DataBinding?资料系结?资料绑定?
    ASP.NET的OutputCache
    我想写程序#3 之 「简单地设计自己的数据表(Table)」
    我想写程序#1 之 「先确立志向」
  • 原文地址:https://www.cnblogs.com/meizixiong/p/3546397.html
Copyright © 2011-2022 走看看