更新记录

1.0.0(2026-08-15)

首个 UTS 正式版本:系统级悬浮球,可拖动、自动吸附(阈值可配置并记忆)、位置/颜色/大小/吸附全记忆、调色盘选色、点击动作自定义、参数即时刷新、权限一键引导,支持 Android 14。


平台兼容性

uni-app(3.8.2)

Vue2 Vue2插件版本 Vue3 Vue3插件版本 Chrome Safari app-vue app-nvue Android Android插件版本 iOS 鸿蒙
1.0.0 1.0.0 - - - - 7.1 1.0.0 × -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x(3.91)

Chrome Safari Android Android插件版本 iOS 鸿蒙 微信小程序
- - 7.1 1.0.0 × - -

其他

多语言 暗黑模式 宽屏模式
×

ZXB-FloatBall 悬浮球(UTS 插件)

让 uni-app App 显示一个系统层悬浮球(可拖动 + 点击回调),悬浮在所有 App 之上。

基于 uni-app x UTS 技术实现,功能与原原生 aar 插件完全等价。

功能

  • ✅ 系统层悬浮(WindowManager TYPE_APPLICATION_OVERLAY,悬浮在所有 App 之上)
  • ✅ 可拖动(拖动超过 10px 判定为拖动)
  • 自动吸附(拖动结束时距四边 <阈值自动贴边,阈值可配置并记忆)
  • 位置记忆(SharedPreferences 持久化,重启后显示在上次位置)
  • 颜色记忆(选色后持久化,重启后保持上次颜色)
  • 位置即时刷新(再次调用时传 x/y 立即移动悬浮球)
  • 边界渐变(半透明灰描边 + 阴影过渡)
  • ✅ 点击回调(未拖动且 <300ms 判定为点击 → 回调 JS { action: 'click', x, y },含点击坐标)
  • ✅ 点击动作可配置(回调自由实现:打开页面/弹窗/任意业务逻辑)
  • ✅ 前台 Service + 常驻通知(悬浮球持续显示)
  • ✅ 参数可配:球大小(dp) / 颜色 / 初始位置 / 吸附阈值
  • ✅ 支持 Android 14(前台服务 specialUse 声明)

快速使用

import { showFloatBall, hideFloatBall, onClick } from '@/uni_modules/ZXB-FloatBall'

// 1. 显示悬浮球
//    color 不传 = 使用记忆颜色;x/y 传 0 = 使用记忆位置;snap 传 0 = 使用记忆吸附阈值
showFloatBall({ size: 60, color: '#5B9BFF', x: 0, y: 0, snap: 60 })

// 2. 注册点击回调(点击时收到 { action: 'click', x, y } 坐标,可自由配置动作)
onClick((res) => {
  console.log('悬浮球被点击', res)   // { action: 'click', x: 980, y: 1500 }
  if (res && res.x > 500) {
    uni.navigateTo({ url: '/pages/xxx/xxx' })   // 示例:点击打开页面
  } else {
    uni.showToast({ title: '点击', icon: 'none' })
  }
})

// 3. 隐藏悬浮球
hideFloatBall({})

参数说明

参数 类型 默认值 说明
size number 60 球直径(dp)
color string 记忆值 球颜色(十六进制);不传=用记忆颜色,无记忆默认 #5B9BFF
x number 记忆值 初始X;0/不传=用记忆位置,无记忆默认右侧
y number 记忆值 初始Y;0/不传=用记忆位置,无记忆默认垂直居中
snap number 记忆值 吸附阈值(dp);0/不传=用记忆值,无记忆默认 60

★记忆机制:位置/颜色/吸附阈值均持久化保存,设置后自动记忆,下次启动自动恢复。

重要:悬浮窗权限

Android 6+ 需要用户授权 "显示在其他应用上层"(SYSTEM_ALERT_WINDOW),否则悬浮球不显示。 调用前建议先检查并引导授权:

// 检查是否已授权悬浮窗权限
if (!plus.android.invoke('android.provider.Settings.canDrawOverlays', plus.android.runtime.startActivity)) {
  // 未授权 → 跳转悬浮窗权限设置页
  const Intent = plus.android.importClass('android.content.Intent')
  const Settings = plus.android.importClass('android.provider.Settings')
  const intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
  plus.android.runtime.startActivity(intent)
}

使用步骤

  1. uni_modules/ZXB-FloatBall 复制到你的 uni-app 项目 uni_modules/ 目录
  2. 制作自定义基座(插件注册了 Service/权限,标准基座跑不了)
  3. 页面中 import 后调用(见上方示例)

常见问题

Q1:悬浮球不显示?

  • 确认用户已授权"显示在其他应用上层"
  • 查看日志:HBuilderX 控制台 Logcat 过滤 ZXBFloatBall,看是否有 "addView 失败"

Q2:点击没反应?

  • 确认先调用了 onClick() 注册回调

Q3:iOS 能用吗?

  • 不能。iOS 无系统层悬浮窗机制,iOS 平台调用为空实现(不报错、无效果)

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android.permission.SYSTEM_ALERT_WINDOW、FOREGROUND_SERVICE、FOREGROUND_SERVICE_SPECIAL_USE、POST_NOTIFICATIONS、INTERNET

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

本插件不采集任何用户数据,无网络请求,纯本地悬浮窗功能

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。