一、实现思路

悬浮窗是一种比较常见的需求,就是把需要展示的内容界面缩小成一个悬浮窗,然后用户可以在其他界面上处理事情。

基本实现原理
主要是通过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权限。

<?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参数时需要注意的问题

//设置类型  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源码,有需要的可以借鉴

=====> Android悬浮窗Demo源码-悬浮球转盘&悬浮加速小火箭效果&悬浮播放视频图片

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐