2. WindowManager使用详解
2.1. 往屏幕上添加一个Window
调用WindowManager的addView方法即可。
private WindowManager mWindowManager;
private View mView;
private WindowManager.LayoutParams mParams;
private void addWindow() {
mWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
mView = new TextView(getApplicationContext());
TextView tv = (TextView) mView;
tv.setText("我是Window中的View");
tv.setTextColor(Color.RED);
mParams = new WindowManager.LayoutParams();
// 设置宽高
mParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
mParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
// 设置Window的背景支持半透明
mParams.format = PixelFormat.TRANSLUCENT;
mParams.flags = WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
mParams.type = WindowManager.LayoutParams.TYPE_TOAST;
// 设置Window的对齐方式,其实就是设置Window的坐标原点位置
mParams.gravity = Gravity.LEFT | Gravity.TOP;
// 设置Window的 x,y 坐标(相对于坐标原点)
mParams.x = 100;
mParams.y = 250;
// 设置Window标题,显示在在 HierarchyView 透视图中的 Windows面板里的名称
mParams.setTitle("AddWindow");
// 往屏幕上添加一个Window,并且把第一个参数View放在Window中
mWindowManager.addView(mView,mParams);
}
显示效果如下:
2.2. 代码详解
上面的代码表示:调用 WindowManager的 addView(View view,WindowManager。LayoutParams lp) 方法,往屏幕上添加一个Window,这个Window中显示的内容为第一个参数设置的View,Window的显示位置以及其他属性由第二个参数 WindowManager。LayoutParams指定。
这个方法很简单,但是 WindowManager。LayoutParams 中有两个字段比较重要,这里详细说一下。
1.flags
用来控制Window的显示特性,有很多可取的值,不同的的值表示不同的显示特性, 如果希望Window具有多个值的特性, 可以使用 “|” 将这些值进行按位或运算。这里介绍几个比较常用的取值:
FLAG_NOT_TOUCHABLE |
Window不接收触摸事件 |
FLAG_NOT_FOCUSABLE |
Window不获取焦点,即不能接收按键事件,按键事件传递给下层具有焦点的Window |
FLAG_NOT_TOUCH_MODAL |
表示系统会将当前Window区域外的任何事件传递给底层的Window,当前Window区域内的事件自己处理,一般来说,都需要开启此标记,否则其他Window无法获取事件. 当设置了FLAG_NOT_FOCUSABLE后,此标记也会自动设置 |
FLAG_KEEP_SCREEN_ON |
Window显示期间,保持屏幕高亮 |
2.type
用来表示Window的类型,Window有三种大的类型,分别是应用Window,子Window和系统Window。Activity的Window就是一种应用Window,Dialog的Window是一种子Window,子Window不能单独存在,必须附属在特定的父Window中,这也就是为什么Dialog的Context必须是Activity。系统Window大都是(不是全部)需要声明权限才能创建,独立应用Window之外,比如Toast,状态栏等等。
Window是分层的,层级大的会覆盖在层级小的之上,三大类Window中,应用Window层级范围是1-99,子Window是1000-1999,系统Window是2000-2999,这就是为什么Dialog显示在Activity之上,而Toast又可以显示在Dialog之上。如图:
type这个字段的取值有很多,不同的值表示不同的层级范围,具体可以看文档,一般来说,如果这个取值为系统Window层级范围内的值,则需要声明权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
另外,type会影响flags的效果,比如,如果type设置为 TYPE_TOAST,则无论怎样设置flags,这个Window都无法接收触摸事件。
2.3. 查看屏幕上的Window
我们再往屏幕上加一个PopupWindow和一个Dialog,当前界面如下:
在Eclipse中,点击菜单 Window - Open Perspective - Others,选择 HierarchyView,打开,选择Windows面板,可以看到当前屏幕中所有的Window:
我们添加的Window在其中显示的标题为AddWindow,另外,我们可以看到还有别的几个Window,比如 PopupWindow,MainActivity,加粗的那一个其实是MainActivity中弹出的Dialog,还能看到 StatusBar(状态栏),RecentsPanel(最近应用列表)等等,这也证明了我们前面说的,Android中所有的界面都是显示在Window中的。
本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/Android