一、WindowManager是什么

       WindowManager是Android中一个重要的Service,是全局且唯一的。WindowManager继承自ViewManager。主要用来管理窗口的一些状态、属性、view增加、删除、更新、窗口顺序、消息收集和处理等。通过Context.getSystemService(Context.WINDOW_SERVICE)的方式可以获得WindowManager的实例。Android中真正展示给用户的是window和view,activity所起的作用主要是处理一些逻辑问题,比如生命周期管理及建立窗口。

二、WindowManager的作用 (参考)

(1)、实现悬浮窗口:

1.获取WindowManager服务:

WindowManager wmManager=(WindowManager) getSystemService(Context.WINDOW_SERVICE); 

2.设置WindowManager.LayoutParams参数

WindowManager.LayoutParams wmParams = new WindowManager.LayoutParams(); 

wmParams.type = LayoutParams.TYPE_PHONE; // 设置window type
      wmParams.format = PixelFormat.RGBA_8888; // 设置图片格式,效果为背景透明

wmParams.flags=LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;

wmParams.gravity = Gravity.RIGHT| Gravity. CENTER_VERTICAL; // 调整悬浮窗口至右侧中间
      wmParams.x = 0;// 以屏幕左上角为原点,设置x、y初始值
      wmParams.y = 0;

wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;// 设置悬浮窗口长宽数据
      wmParams.height =WindowManager.LayoutParams.WRAP_CONTENT;

3.添加view到屏幕

wmManager.addView(view,wmParams);

4.从屏幕上删除view

wmManager.removeView(view);

5.悬浮窗口需添加权限

 

(2)、通过WindowManager中的Display获取屏幕大小:

wmManager.getDefaultDisplay().getWidth();

wmManager.getDefaultDisplay().getHeight();

 

(3)、改变Dialog背景透明度:

Dialog dg = new Dialog(this); 

Window window = dg.getWindow(); 

WindowManager.LayoutParams lp = window.getAttributes(); 

lp.alpha = 0.5f; 

window.setAttributes(lp);


二、WindowManager的使用

WindowManager的方法很简单,基本用到的就三个addView,removeView,updateViewLayout  

在WindowManager中还有一个重要的静态类LayoutParams.通过它可以设置和获得当前窗口的一些属性。通过WindowManager的addView方法创建View,这样产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。比如创建系统顶级窗口,实现悬浮窗口效果(顶级窗口控)!


以悬浮窗口为例

addView方法用于添加一个悬浮窗,updateViewLayout方法用于更新悬浮窗的参数,removeView用于移除悬浮窗。其中悬浮窗的参数有必要详细说明一下。

WindowManager.LayoutParams这个类用于提供悬浮窗所需的参数,其中有几个经常会用到的变量:

type值用于确定悬浮窗的类型,一般设为2002,表示在所有应用程序之上,但在状态栏之下。

flags值用于确定悬浮窗的行为,比如说不可聚焦,非模态对话框等等,属性非常多,大家可以查看文档。

gravity值用于确定悬浮窗的对齐方式,一般设为左上角对齐,这样当拖动悬浮窗的时候方便计算坐标。

x值用于确定悬浮窗的位置,如果要横向移动悬浮窗,就需要改变这个值。

y值用于确定悬浮窗的位置,如果要纵向移动悬浮窗,就需要改变这个值。

width值用于指定悬浮窗的宽度。

height值用于指定悬浮窗的高度。


Button bb=new Button(this);
  bb.setText("nimei");
  
   //.获取WindowManager服务:"window"
  WindowManager wManager = (WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
  
      /**
         *设置WindowManager.LayoutParams的相关属性
         * 具体用途请参考SDK文档
         */
  WindowManager.LayoutParams wParams = new WindowManager.LayoutParams();

  wParams.type = LayoutParams.TYPE_PHONE ; //设置window type,type是关键,这里的"2002" 表示系统级窗口,你也可以试试2003
  wParams.format =  PixelFormat.RGBA_8888; 设置图片格式,1  效果为背景透明
  

  wParams.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL | LayoutParams.FLAG_NOT_FOCUSABLE | LayoutParams.FLAG_NOT_TOUCHABLE;
  wParams.gravity = Gravity.RIGHT| Gravity. CENTER_VERTICAL;// 调整悬浮窗口至右侧中间
  wParams.width = WindowManager.LayoutParams.WRAP_CONTENT;// 设置悬浮窗口长宽数据
  wParams.height =WindowManager.LayoutParams.WRAP_CONTENT;
  wManager.addView(bb, wParams);//bb添加view到屏幕
  
  //wManager.removeView(bb); //从屏幕上删除bb(view)
  //悬浮窗口需添加权限


 

更多相关文章

  1. Android(安卓)Mms 专题——PDU介绍
  2. 更新Android(安卓)SDK的小技巧
  3. android 切换anctivity
  4. OpenGL学习1
  5. android辅助圆按钮
  6. Android(安卓)启动暗码打开指令窗口
  7. Android(安卓)PopupWindow增加半透明蒙层
  8. android文件打开方式
  9. 弹出NumberPicker窗口,修改字体大小

随机推荐

  1. Android修炼之道——Shape
  2. android基于dialog加载时转圈圈的demo
  3. Android(安卓)视频分离和合成(MediaMuxer
  4. 通过AndroidTestCase来进行android 单元
  5. android琐碎记四
  6. How to change an Android app's name?
  7. 同样line-height下ios和Android显示不一
  8. Android小知识7
  9. android 2.3 修改 statusbar
  10. Android(安卓)拦截音量键,控制系统媒体音