Android全屏悬浮窗画布,使用WindowManager实现Android悬浮窗

WindowManager介绍

通过Context.getSystemService(Context.WINDOW_SERVICE)可以获得 WindowManager对象。

每一个WindowManager对象都和一个特定的 Display绑定。

想要获取一个不同的display的WindowManager,可以用 createDisplayContext(Display)来获取那个display的 Context,之后再使用:

Context.getSystemService(Context.WINDOW_SERVICE)来获取WindowManager。

使用WindowManager可以在其他应用最上层,甚至手机桌面最上层显示窗口。

调用的是WindowManager继承自基类的addView方法和removeView方法来显示和隐藏窗口。具体见后面的实例。

另:API 17推出了Presentation,它将自动获取display的Context和WindowManager,可以方便地在另一个display上显示窗口。

WindowManager实现悬浮窗例子

声明权限

首先在manifest中添加如下权限:

注意:在MIUI上需要在设置中打开本应用的”显示悬浮窗”开关,并且重启应用,否则悬浮窗只能显示在本应用界面内,不能显示在手机桌面上。

服务获取和基本参数设置// 获取应用的Context

mContext = context.getApplicationContext();

// 获取WindowManager

mWindowManager = (WindowManager) mContext

.getSystemService(Context.WINDOW_SERVICE);

参数设置:final WindowManager.LayoutParams params = new WindowManager.LayoutParams();

// 类型

params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

// WindowManager.LayoutParams.TYPE_SYSTEM_ALERT

// 设置flag

int flags = WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM;

// | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

// 如果设置了WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,弹出的View收不到Back键的事件

params.flags = flags;

// 不设置这个弹出框的透明遮罩显示为黑色

params.format = PixelFormat.TRANSLUCENT;

// FLAG_NOT_TOUCH_MODAL不阻塞事件传递到后面的窗口

// 设置 FLAG_NOT_FOCUSABLE 悬浮窗口较小时,后面的应用图标由不可长按变为可长按

// 不设置这个flag的话,home页的划屏会有问题

params.width = LayoutParams.MATCH_PARENT;

params.height = LayoutParams.MATCH_PARENT;

params.gravity = Gravity.CENTER;

点击和按键事件

除了View中的各个控件的点击事件之外,弹窗View的消失控制需要一些处理。

点击弹窗外部可隐藏弹窗的效果,首先,悬浮窗是全屏的,只不过最外层的是透明或者半透明的:

布局如下:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:layout_gravity="center"

android:background="@color/darken_background"

android:gravity="center"

android:orientation="vertical" >

android:id="@+id/popup_window"

android:layout_width="@dimen/dialog_window_width"

android:layout_height="@dimen/dialog_window_height"

android:background="@color/white"

android:orientation="vertical" >

android:id="@+id/title"

你可能感兴趣的:(Android全屏悬浮窗画布)