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

Android培训之WindowManager的使用

更新时间:2016年07月23日15时11分 来源:Android培训学员 浏览次数:

1. WindowManager,Window的介绍

1.1. Window

Window表示一个窗口。对于Android里的Window,我们可以类比Windows系统中的Window,在Windows中,每打开一个软件,都会弹出一个窗口,这个窗口右上角有最小化,最大化,关闭按钮,做了某些操作时,也可能会弹出一个窗口,下面可能会有确定,取消之类的按钮,这些都是Windows系统中的窗口。如图所示:


Android中所有的界面都是显示在一个个Window中的,包括Activity,Dialog,Toast,甚至状态栏,最近应用列表,都是在Window中显示的。只是我们看不到这些Window的边框,只能看到里面的内容。其实 Window并不能真正的显示内容,它只是一个虚拟的"框",真正能显示内容的是View。Window是View的直接管理者,触摸事件也是先由Window接收,然后传递给View的。
Window是一个抽象类,在Android手机中,Window的实现类是PhoneWindow。

1.2. WindowManager

WindowManager是Window的管理者,对应着系统底层的一个服务:WindowManagerService。
我们无法直接访问Window,要操作Window,必须通过WindowManager。WindowManager有三个常用方法:addView,removeView,updateViewLayout我们可以通过WindowManager往屏幕上添加/删除一个Window,或者通过它修改一个Window的布局参数。
WindowManager是一个接口,在Android中,WindowManager的实现类WindowManagerImpl。

2. WindowManager使用详解

2.1. 往屏幕上添加一个Window

调用WindowManager的addView方法即可。

显示效果如下:

2.2. 代码详解

上面的代码表示:调用 WindowManager的 addView(View view,WindowManager。LayoutParams lp) 方法,往屏幕上添加一个Window,这个Window中显示的内容为第一个参数设置的View,Window的显示位置以及其他属性由第二个参数 WindowManager。LayoutParams指定。
这个方法很简单,但是 WindowManager。LayoutParams 中有两个字段比较重要,这里详细说一下。
1.flags
用来控制Window的显示特性,有很多可取的值,不同的的值表示不同的显示特性, 如果希望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中的。

3桌面悬浮窗实现思路

3.1. 在桌面上显示Window

如果我们在Activity中使用WindowManager添加Window,当Activity退出时,添加的Window也会被回收掉。所以要想在桌面上显示悬浮窗,可以在Service中使用WindowManager添加Window,这样只要服务不停止,就可以一直显示。当服务启动时,在其onCreate方法中,使用WindowManager的 addView方法添加一个系统Window,当服务销毁时,可以在其 onDestroy中使用WindowManager的removeView 方法移除Window。大体是这样的思路,代码就不再给出了。

3.2.. 让这个Window随手指移动

要想让这个Window能接收事件,需要给他设置相应的flags(只要不包含FLAG_NOT_TOUCHABLE即可),另外其type也不能是 TYPE_TOAST。可以使用:TYPE_PRIORITY_PHONE,表示比来去电界面的Window级别还要高一些(来去电界面的Window是系统Window)。

注意添加权限:

 然后给Window里的View设置onTouchListener,重写onTouch方法:

这样就实现了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天免费试学

    基础班入门课程限时免费

    申请试学名额