一、实现思路
悬浮窗是一种比较常见的需求,就是把需要展示的内容界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。
基本实现原理:
主要是通过WindowManager
这个类来实现
addView方
法用于添加一个悬浮窗,
updateViewLayout
方法用于更新悬浮窗的参数,
removeView
用于移除悬浮窗。
相关API
① WindowManager
windowManager.addView(View var1, ViewGroup.LayoutParams var2);//添加悬浮窗View
windowManager.removeView(View var1));//移除悬浮窗View
windowManager.updateViewLayout(View var1, ViewGroup.LayoutParams var2);//设置悬浮窗View布局参数
② WindowManager.LayoutParams 这个类用于提供悬浮窗所需的参数,其中有几个经常会用到的变量:
type :值用于确定悬浮窗的类型,一般设为2002,表示在所有应用程序之上,但在状态栏之下。
flags:值用于确定悬浮窗的行为,比如说不可聚焦,非模态对话框等等,属性非常多,大家可以查看文档。
gravity:值用于确定悬浮窗的对齐方式,一般设为左上角对齐,这样当拖动悬浮窗的时候方便计算坐标。
x:值用于确定悬浮窗的位置,如果要横向移动悬浮窗,就需要改变这个值。
y :值用于确定悬浮窗的位置,如果要纵向移动悬浮窗,就需要改变这个值。
width :值用于指定悬浮窗的宽度。 height :值用于指定悬浮窗的高度。
③ mView.setOnTouchListener(OnTouchListener l) //监听 MotionEvent.ACTION_DOWN 和 MotionEvent.ACTION_MOVE事件 更新设置悬浮窗的参数
相关权限
创建悬浮窗这种窗体需要向用户申请权限才可以的。因此需要在AndroidManifest.xml中加入SYSTEM_ALERT_WINDOW权限。
java
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.crazy.floatwindow">
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.GET_TASKS" />
</manifest>
设置WindowManager.LayoutParams里面的type参数时需要注意的问题
java
//设置类型 android8.0后有变化此处进行修改
if (Build.VERSION.SDK_INT >= 26) {
mWindowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
} else {
mWindowParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
}
二、效果展示
|---------|
| 悬浮球转盘效果 |
|-----------|
| 悬浮加速小火箭效果 |
|------------|
| 悬浮播放视频图片效果 |
三、源码下载
源码放在CSDN上了,包含上述三种悬浮窗效果实现APK源码,有需要的可以借鉴