全国咨询/投诉热线:400-618-4000

Android培训之WindowManager的使用(二)

更新时间:2016年07月13日17时02分 来源:Android培训学院 浏览次数:

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

javaee

python

web

ui

cloud

test

c

netmarket

pm

Linux

movies

robot

uids

北京校区

    14天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    15天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    8天免费试学

    基础班入门课程限时免费

    申请试学名额

    20天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    0天免费试学

    基础班入门课程限时免费

    申请试学名额

    12天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    5天免费试学

    基础班入门课程限时免费

    申请试学名额

    10天免费试学

    基础班入门课程限时免费

    申请试学名额