更新记录
1.0.0(2026-06-18)
- 首版发布
lizhao-float-window 纯 UTS 悬浮窗与画中画 API 插件。
- Android 支持全局悬浮窗
overlay 与应用内悬浮窗 inApp。
- Android 支持 WebView 自定义内容,可加载远程 URL 与本地 HTML。
- Android 支持拖拽、显示/隐藏、置顶、关闭、坐标查询、坐标设置、预设尺寸和自定义尺寸。
- Android 支持视频流场景进入画中画,非视频内容会返回明确错误。
- Android 支持悬浮窗权限检查、权限设置页引导、运行态快照和诊断报告。
- iOS 支持应用内轻量浮窗和最佳努力 PiP,并明确不支持跨应用全局悬浮。
- iOS 首发已内置
FloatWindowIosViewBridge 兼容处理,收口 CGFloat 坐标读取、可空 UIKit 挂载/置顶和 ?uts-proxy 导出声明问题。
- Harmony、Web、微信小程序、支付宝小程序提供能力矩阵与统一错误语义。
- 提供标准 API 与常用兼容别名:
open / close / show / hide / setPosition / getPosition / setContent / setDragEnable / toFront。
- 监听 API 支持不传 options 进行清理,避免客户在页面卸载时因省略参数触发桥接空参数异常。
- 补充从简单到复杂的 README 接入文档,覆盖最小示例、常见增强、API 表、参数表、平台边界、权限与自定义基座说明。
平台兼容性
uni-app(4.84)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(4.84)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| √ |
√ |
√ |
√ |
√ |
√ |
lizhao-float-window
lizhao-float-window 是一个面向 uni-app / uni-app x 的纯 UTS 悬浮窗与画中画 API 插件。它把 Android 全局悬浮窗、应用内悬浮窗、WebView 自定义内容、拖拽、大小切换、坐标管理和视频画中画入口封装成统一 API,适合直播小窗、客服浮窗、工具面板、业务公告、悬浮按钮和本地 HTML 面板等场景。
功能特色
- Android 支持全局悬浮窗与应用内悬浮窗,可加载远程 URL 或本地 HTML。
- 支持拖拽、显示/隐藏、置顶、关闭、坐标查询、坐标设置和大小切换。
- 支持
small / medium / large / custom 四类尺寸方案,便于从悬浮球扩展到内容卡片。
- 支持视频流场景进入 Android 画中画模式,普通内容会返回明确错误,避免伪成功。
- 支持 Android 悬浮窗权限检查、权限设置页引导、运行状态查询和诊断报告,便于客户接入和售后定位。
- iOS 提供应用内轻量浮窗与最佳努力 PiP 能力,并明确说明系统不支持跨应用全局悬浮。
- Harmony、Web、微信小程序、支付宝小程序提供能力矩阵和统一错误语义,方便业务做多端兜底。
适用场景
| 场景 |
推荐能力 |
说明 |
| 直播/视频小窗 |
openFloatWindow + enterPictureInPicture |
先用悬浮窗承载页面或播放入口,视频流需要时再进入 PiP。 |
| 客服/营销浮窗 |
openFloatWindow + setFloatWindowContent |
使用远程 URL 或本地 HTML 展示可运营内容。 |
| 工具面板 |
inApp 模式 + setFloatWindowSizePreset |
应用内悬浮,不要求 Android 系统悬浮窗权限。 |
| 悬浮球入口 |
small 或 custom 小尺寸 |
首版可用小尺寸 WebView 承载图标页,后续版本会增强原生悬浮球。 |
| 多端统一接入 |
getCapabilities |
先读取能力矩阵,再决定是否展示入口或走降级逻辑。 |
接入前先看
| 项目 |
说明 |
| 插件类型 |
UTS API 插件 |
| 推荐导入路径 |
@/uni_modules/lizhao-float-window |
| Android 全局悬浮 |
支持,需要 SYSTEM_ALERT_WINDOW 权限和自定义基座 |
| Android 应用内悬浮 |
支持,不需要系统悬浮窗权限 |
| Android 内容承载 |
WebView,支持 URL 与本地 HTML |
| Android PiP |
支持 Android 8.0 及以上视频流场景 |
| iOS 全局悬浮 |
不支持,系统限制 |
| iOS 应用内悬浮 |
支持轻量浮窗 |
| Harmony/Web/小程序 |
首版提供能力矩阵和明确不支持错误 |
最小可运行示例
1. 读取能力矩阵
import { getCapabilities } from '@/uni_modules/lizhao-float-window'
// 先读取平台能力,业务可据此决定是否展示悬浮窗入口。
getCapabilities({
success(res) {
console.log('悬浮窗能力矩阵', res)
},
fail(err) {
console.log('读取能力失败', err)
}
})
2. 打开 Android 全局悬浮窗
import { openFloatWindow } from '@/uni_modules/lizhao-float-window'
// overlay 是 Android 全局悬浮窗模式,需要系统悬浮窗权限。
openFloatWindow({
mode: 'overlay',
content: {
type: 'url',
value: 'https://www.dcloud.io',
isVideoStream: false
},
sizePreset: 'medium',
dragEnabled: true,
success(res) {
console.log('打开全局悬浮窗成功', res)
},
fail(err) {
console.log('打开全局悬浮窗失败', err)
}
})
3. 打开应用内悬浮窗
import { open } from '@/uni_modules/lizhao-float-window'
// inApp 是应用内悬浮模式,适合工具面板、活动提示、客服入口等场景。
open({
mode: 'inApp',
content: {
type: 'localAsset',
value: 'static/float-window-demo.html',
isVideoStream: false
},
size: {
width: 360,
height: 220
},
dragEnabled: true,
success(res) {
console.log('打开应用内悬浮窗成功', res)
},
fail(err) {
console.log('打开应用内悬浮窗失败', err)
}
})
常见增强示例
切换浮窗大小
import { setFloatWindowSizePreset, setFloatWindowSize } from '@/uni_modules/lizhao-float-window'
// 使用预设尺寸快速切换为大窗。
setFloatWindowSizePreset({
preset: 'large',
success(res) {
console.log('切换为 large 成功', res)
}
})
// 使用 custom 尺寸适配自己的业务面板。
setFloatWindowSize({
size: {
width: 300,
height: 180
},
success(res) {
console.log('切换自定义尺寸成功', res)
}
})
移动与查询位置
import { setPosition, getPosition } from '@/uni_modules/lizhao-float-window'
// 将悬浮窗移动到左上方业务安全区域。
setPosition({
position: {
x: 20,
y: 120
},
success(res) {
console.log('移动悬浮窗成功', res)
}
})
// 查询当前位置,适合保存用户拖拽后的坐标。
getPosition({
success(res) {
console.log('当前悬浮窗坐标', res)
}
})
监听拖拽与点击
import { onMove, onClick, offMove, offClick } from '@/uni_modules/lizhao-float-window'
// 监听拖拽坐标,业务可用于位置记忆或吸附逻辑。
onMove({
listener(event) {
console.log('悬浮窗移动', event.x, event.y)
}
})
// 监听悬浮窗点击,适合打开业务页或展开面板。
onClick({
listener(event) {
console.log('悬浮窗点击', event)
}
})
// 页面卸载时建议主动取消监听。
offMove({})
offClick({})
动态切换内容
import { setContent } from '@/uni_modules/lizhao-float-window'
// 将悬浮窗内容切换为本地 HTML。
setContent({
content: {
type: 'localAsset',
value: 'static/float-window-demo.html',
isVideoStream: false
},
success(res) {
console.log('切换本地内容成功', res)
}
})
视频流进入画中画
import { enterPictureInPicture, exitPictureInPicture } from '@/uni_modules/lizhao-float-window'
// PiP 只面向视频流场景,普通网页内容会返回明确错误。
enterPictureInPicture({
content: {
type: 'url',
value: 'https://example.com/live.m3u8',
isVideoStream: true
},
success(res) {
console.log('进入画中画成功', res)
},
fail(err) {
console.log('进入画中画失败', err)
}
})
// 需要恢复主应用时调用退出逻辑。
exitPictureInPicture({
success(res) {
console.log('退出画中画成功', res)
}
})
权限与诊断
import {
checkOverlayPermission,
openOverlayPermissionSettings,
getFloatWindowState,
getFloatWindowDiagnostics
} from '@/uni_modules/lizhao-float-window'
// Android 全局悬浮前建议先检查权限,未授权时再引导用户打开设置页。
checkOverlayPermission({
success(res) {
console.log('悬浮窗权限状态', res)
if (res.requiresOverlayPermission && !res.granted && res.canOpenSettings) {
openOverlayPermissionSettings({})
}
}
})
// 查询当前运行态,适合保存位置或判断是否需要重复打开。
getFloatWindowState({
success(res) {
console.log('悬浮窗运行状态', res)
}
})
// 导出诊断报告,适合售后排查权限、WebView、窗口附着和监听器状态。
getFloatWindowDiagnostics({
success(res) {
console.log('悬浮窗诊断报告', res)
}
})
完整示例
| 示例 |
路径 |
说明 |
| 演示页面 |
pages/floatWindow/floatWindow.vue |
覆盖全局悬浮、应用内悬浮、尺寸切换、拖拽、内容切换和 PiP。 |
| 本地 HTML 内容 |
static/float-window-demo.html |
用于演示 localAsset 内容加载。 |
API 列表
| API |
说明 |
getCapabilities(options) |
获取当前平台能力矩阵。 |
openFloatWindow(options) / open(options) |
打开悬浮窗。 |
updateFloatWindow(options) / setConfig(options) |
更新悬浮窗配置。 |
closeFloatWindow(options) / close(options) |
关闭悬浮窗。 |
showFloatWindow(options) / show(options) |
显示悬浮窗。 |
hideFloatWindow(options) / hide(options) |
隐藏悬浮窗。 |
bringFloatWindowToFront(options) / toFront(options) |
将悬浮窗置顶。 |
setFloatWindowPosition(options) / setPosition(options) |
设置悬浮窗坐标。 |
getFloatWindowPosition(options) / getPosition(options) |
查询悬浮窗坐标。 |
setFloatWindowSize(options) / setSize(options) |
设置自定义尺寸。 |
setFloatWindowSizePreset(options) |
设置预设尺寸。 |
setFloatWindowDragEnabled(options) / setDragEnable(options) |
开启或关闭拖拽。 |
setFloatWindowContent(options) / setContent(options) |
更新悬浮窗内容。 |
enterPictureInPicture(options) |
进入画中画。 |
exitPictureInPicture(options) |
退出画中画。 |
checkOverlayPermission(options) |
检查 Android 系统悬浮窗权限。 |
openOverlayPermissionSettings(options) |
打开 Android 系统悬浮窗权限设置页。 |
getFloatWindowState(options) |
获取当前悬浮窗运行态快照。 |
getFloatWindowDiagnostics(options) |
获取权限、窗口、WebView 和监听器诊断报告。 |
onMove(options) / offMove(options) |
订阅/取消拖拽事件。 |
onClick(options) / offClick(options) |
订阅/取消点击事件。 |
onContentEvent(options) / offContentEvent(options) |
订阅/取消内容事件。 |
openFloatWindow(options)
说明
打开悬浮窗。Android 可使用 overlay 全局悬浮或 inApp 应用内悬浮;iOS 仅支持 inApp 和最佳努力 PiP。
支持平台
Android / iOS
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
OpenFloatWindowOptions |
是 |
打开悬浮窗参数对象 |
无 |
mode / content / position / size / sizePreset / dragEnabled / visible / success / fail / complete |
| options.mode |
FloatWindowMode |
否 |
悬浮窗模式 |
Android 默认 overlay,iOS 默认 inApp |
inApp / overlay / pip |
| options.content |
FloatWindowContent |
是 |
悬浮窗内容 |
无 |
type / value / isVideoStream / bridgeName / userAgentSuffix |
| options.position |
FloatWindowPosition |
否 |
初始坐标 |
Android { x: 72, y: 180 },iOS { x: 24, y: 120 } |
x / y |
| options.size |
FloatWindowSize |
否 |
自定义尺寸 |
无 |
width / height |
| options.sizePreset |
FloatWindowSizePreset |
否 |
尺寸预设 |
medium |
small / medium / large / custom |
| options.dragEnabled |
boolean |
否 |
是否允许拖拽 |
true |
true / false |
| options.visible |
boolean |
否 |
打开后是否立即显示 |
true |
true / false |
| options.success |
function |
否 |
打开成功回调 |
无 |
无 |
| options.fail |
function |
否 |
打开失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调,成功或失败都会触发 |
无 |
无 |
返回值
| 字段 |
类型 |
说明 |
| opened |
boolean |
是否已打开 |
| visible |
boolean |
当前是否可见 |
| mode |
FloatWindowMode |
当前模式 |
| dragEnabled |
boolean |
是否允许拖拽 |
| position |
FloatWindowPosition |
当前坐标 |
| size |
FloatWindowSize |
当前尺寸 |
| sizePreset |
FloatWindowSizePreset |
当前尺寸预设 |
| content |
FloatWindowContent | null |
当前内容 |
getCapabilities(options)
说明
获取当前平台支持情况。建议业务在展示入口前先调用该 API。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GetCapabilitiesOptions |
否 |
能力查询回调对象 |
无 |
success / fail / complete |
| options.success |
function |
否 |
查询成功回调 |
无 |
无 |
| options.fail |
function |
否 |
查询失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
返回值
| 字段 |
类型 |
说明 |
| supported |
boolean |
当前平台是否可接入插件能力 |
| platform |
string |
当前平台名称 |
| inApp |
boolean |
是否支持应用内悬浮 |
| overlay |
boolean |
是否支持全局悬浮 |
| pip |
boolean |
是否支持画中画 |
| draggable |
boolean |
是否支持拖拽 |
| resizable |
boolean |
是否支持大小切换 |
| webContent |
boolean |
是否支持 Web 内容 |
| localAssetContent |
boolean |
是否支持本地 HTML 内容 |
| requiresOverlayPermission |
boolean |
是否需要系统悬浮窗权限 |
| requiresCustomBase |
boolean |
是否需要自定义基座 |
| restrictedReason |
string |
不支持或受限原因 |
checkOverlayPermission(options)
说明
检查 Android 系统悬浮窗权限。非 Android 平台会返回明确平台边界,业务可据此隐藏全局悬浮入口。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
CheckOverlayPermissionOptions |
否 |
权限检查回调对象 |
无 |
success / fail / complete |
| options.success |
function |
否 |
检查成功回调 |
无 |
无 |
| options.fail |
function |
否 |
检查失败回调 |
无 |
无 |
| options.complete |
function |
否 |
完成回调 |
无 |
无 |
返回值
| 字段 |
类型 |
说明 |
| platform |
string |
当前平台 |
| granted |
boolean |
是否已授权 |
| requiresOverlayPermission |
boolean |
是否需要系统悬浮窗权限 |
| canOpenSettings |
boolean |
是否可打开系统设置页 |
| settingsUri |
string |
Android 设置页 URI |
| packageName |
string |
Android 应用包名 |
| restrictedReason |
string |
平台限制说明 |
getFloatWindowState(options)
说明
获取当前悬浮窗运行态快照,适合判断是否已打开、是否可见、当前尺寸和坐标。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GetFloatWindowStateOptions |
否 |
状态查询回调对象 |
无 |
success / fail / complete |
返回值
| 字段 |
类型 |
说明 |
| opened |
boolean |
是否已打开 |
| visible |
boolean |
是否可见 |
| mode |
FloatWindowMode |
当前模式 |
| dragEnabled |
boolean |
是否允许拖拽 |
| position |
FloatWindowPosition |
当前坐标 |
| size |
FloatWindowSize |
当前尺寸 |
| sizePreset |
FloatWindowSizePreset |
当前尺寸预设 |
| content |
FloatWindowContent | null |
当前内容 |
getFloatWindowDiagnostics(options)
说明
获取运行诊断报告,便于客户接入、插件市场演示和售后排查。
参数
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| options |
GetFloatWindowDiagnosticsOptions |
否 |
诊断查询回调对象 |
无 |
success / fail / complete |
返回值
| 字段 |
类型 |
说明 |
| platform |
string |
当前平台 |
| state |
FloatWindowState |
当前运行态快照 |
| overlayPermission |
OverlayPermissionResult |
悬浮窗权限状态 |
| webViewReady |
boolean |
Android WebView 是否已创建 |
| windowAttached |
boolean |
原生窗口是否已附着 |
| layoutReady |
boolean |
原生布局参数是否已就绪 |
| listenerStatus |
FloatWindowListenerStatus |
拖拽、点击、内容事件监听状态 |
| requiresCustomBase |
boolean |
是否需要自定义基座 |
| sdkInt |
number |
Android SDK 版本 |
| restrictedReason |
string |
平台限制说明 |
通用参数类型
FloatWindowContent
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| type |
FloatWindowContentType |
是 |
内容类型 |
无 |
url / localAsset |
| value |
string |
是 |
URL 地址或本地资源路径 |
无 |
无 |
| isVideoStream |
boolean |
否 |
是否为视频流内容,PiP 场景必须为 true |
false |
true / false |
| bridgeName |
string |
否 |
预留桥接通道名 |
无 |
无 |
| userAgentSuffix |
string |
否 |
Android WebView UA 后缀 |
无 |
无 |
FloatWindowPosition
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| x |
number |
是 |
屏幕横向坐标 |
无 |
无 |
| y |
number |
是 |
屏幕纵向坐标 |
无 |
无 |
FloatWindowSize
| 参数 |
类型 |
必填 |
说明 |
默认值 |
可选参数 |
| width |
number |
是 |
宽度,Android 最小会收敛到 120 |
无 |
无 |
| height |
number |
是 |
高度,Android 最小会收敛到 90 |
无 |
无 |
平台支持
| 平台 |
是否支持 |
说明 |
| App-Android |
是 |
支持全局悬浮、应用内悬浮、WebView 内容、拖拽、尺寸切换、位置管理和 PiP。 |
| App-iOS |
部分支持 |
支持应用内轻量浮窗和最佳努力 PiP,不支持跨应用全局悬浮。 |
| App-Harmony |
降级 |
首版返回能力矩阵和明确不支持错误。 |
| Web |
降级 |
首版返回能力矩阵和明确不支持错误。 |
| 微信小程序 |
降级 |
首版返回能力矩阵和明确不支持错误。 |
| 支付宝小程序 |
降级 |
首版返回能力矩阵和明确不支持错误。 |
错误码
| 错误码 |
含义 |
说明 |
| 9015001 |
unsupported |
当前平台或能力暂不支持。 |
| 9015002 |
invalid params |
参数为空、内容为空或参数不合法。 |
| 9015003 |
overlay permission denied |
Android 未授予系统悬浮窗权限。 |
| 9015004 |
not opened |
悬浮窗尚未打开。 |
| 9015005 |
already opened |
悬浮窗已经打开,重复打开前请先关闭。 |
| 9015006 |
mode restricted |
当前平台不支持请求的模式,例如 iOS 请求全局悬浮。 |
| 9015007 |
pip content invalid |
PiP 内容不符合要求,通常是未声明视频流。 |
| 9015008 |
native failure |
原生能力调用失败。 |
| 9015009 |
content load failed |
内容加载失败。 |
| 9015010 |
listener missing |
监听器缺失或不合法。 |
权限与自定义基座
Android
插件声明了以下权限:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name="android.permission.INTERNET" />
| 能力 |
是否需要自定义基座 |
说明 |
全局悬浮窗 overlay |
是 |
需要 Android 原生悬浮窗权限和 UTS 原生逻辑。 |
应用内悬浮窗 inApp |
是 |
不需要系统悬浮窗权限,但仍依赖 UTS 原生逻辑。 |
| WebView 内容 |
是 |
使用 Android 原生 WebView。 |
| PiP |
是 |
使用 Android 原生画中画能力。 |
iOS
iOS 系统不允许普通应用创建跨应用全局悬浮窗。本插件首版提供应用内轻量浮窗和最佳努力 PiP,不承诺跨应用悬浮。
注意事项
- Android 全局悬浮窗需要用户在系统设置中授权;未授权时会返回
9015003。
- PiP 只建议用于视频流场景,普通网页或业务卡片请使用悬浮窗模式。
- 当前 Android 自定义内容使用 WebView 承载,适合远程运营页和本地 HTML;后续版本计划补充原生悬浮球和 JSBridge 增强。
- iOS 受系统策略限制,不支持跨应用全局悬浮,发布说明中请勿承诺该能力。
- Harmony/Web/小程序首版以能力矩阵和明确错误为主,业务应先调用
getCapabilities 做入口控制。
版本规划
| 版本 |
规划 |
| 1.0.0 |
首版发布:Android 全局/应用内悬浮、WebView 内容、拖拽、尺寸切换、位置管理、显隐控制、PiP 入口、权限与诊断 API、iOS 应用内轻量浮窗、多端能力矩阵,并已收口 iOS 云打包兼容处理。 |
| 后续版本 |
增强 JSBridge、悬浮球模式、边缘吸附、坐标记忆、原生内容模板、诊断报告归档和更完整的发布守卫。 |
作者系列UTS插件
以下为已在 DCloud 插件市场上架的作者系列 UTS 插件,可按业务场景组合使用。未列出的插件表示当前未确认公开市场页,后续上架后再补充。
| 插件 |
能力方向 |
插件市场 |
lizhao-scan-pro |
原生扫码、连续扫码、相册识别 |
查看插件 |
lizhao-choose-file |
原生文件选择、上传、进度与取消 |
查看插件 |
lizhao-bg-audio |
背景音频播放、队列、倍速与事件 |
查看插件 |
lizhao-smart-tts |
系统 TTS、云端合成、听书方案 |
查看插件 |
lizhao-share-plus |
系统分享、远程文件下载后分享 |
查看插件 |
lizhao-sqlite-pro |
原生 SQLite、迁移、备份与诊断 |
查看插件 |
lizhao-icon-pro |
SVG 图标组件、多主题与缓存 |
查看插件 |
lizhao-cast-screen |
DLNA 投屏、AirPlay 路由入口 |
查看插件 |
lizhao-call-kit |
电话、短信、通讯录原生能力 |
查看插件 |
lizhao-app-keepalive |
应用保活、唤醒、自愈与报告 |
查看插件 |
lizhao-doc-corrector |
文档扫描、矫正、增强与识别 |
查看插件 |
lizhao-emu-detect |
模拟器环境检测、风险评分与证据 |
查看插件 |