HarmonyOS 鸿蒙Next 如何实现类似微信音视频通话悬浮窗
HarmonyOS 鸿蒙Next 如何实现类似微信音视频通话悬浮窗
类似于微信音视频通话,视频是悬浮视频画面,音频是悬浮按钮
2 回复
可以通过window.createWindow来展示悬浮窗
1.目前悬浮窗不支持根据用户拖动来改变位置,但是可以通过在悬浮窗设置拖拽控件,监听拖拽方法来改变窗口的位置。
2.子窗口不支持悬浮,会随主窗口进入后台而进入后台,子窗口只能在windowStage中创建。
说明:首先需要通过应用市场(AGC)申请ACL权限“ohos.permission.SYSTEM_FLOAT_WINDOW”
并在在配置文件中添加权限说明,从而允许应用使用悬浮窗的能力。
// 共两个Ets文件:Index.ets、Page.ets
// Index.ets
import window from '@ohos.window'
import common from '@ohos.app.ability.common'
@Entry
@Component
struct Index {
context = getContext(this) as common.UIAbilityContext
build() {
Row() {
Column() {
Button("创建悬浮窗")
.fontSize(50)
.fontWeight(FontWeight.Bold)
.onClick(() => {
this.createWindow()
})
}.width('100%')
}.height('100%')
}
createWindow() {
let windowClass;
let config = { name: "floatWindow", windowType: window.WindowType.TYPE_FLOAT, ctx: this.context };
window.createWindow(config, (err, data) => {
if (err.code) {
console.error('Failed to create the floatWindow. Cause: ' + JSON.stringify(err));
return;
}
console.info('Succeeded in creating the floatWindow. Data: ' + JSON.stringify(data));
windowClass = data;
// 3.悬浮窗窗口创建成功后,设置悬浮窗的位置、大小及相关属性等。
windowClass.moveWindowTo(300, 300, (err) => {
if (err.code) {
console.error('Failed to move the window. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in moving the window.');
});
windowClass.resize(500, 500, (err) => {
if (err.code) {
console.error('Failed to change the window size. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in changing the window size.');
});
// 4.为悬浮窗加载对应的目标页面。
windowClass.setUIContent("pages/Page", (err) => {
if (err.code) {
console.error('Failed to load the content. Cause:' + JSON.stringify(err));
return;
}
console.info('Succeeded in loading the content.');
// 4.显示悬浮窗。
windowClass.showWindow((err) => {
if (err.code) {
console.error('Failed to show the window. Cause: ' + JSON.stringify(err));
return;
}
console.info('Succeeded in showing the window.')
})
})
})
}
}
// Page.ets 在悬浮窗中的控件监听拖拽事件,在aboutToAppear通过窗口名获取到窗口,然后根据控件的拖拽事件,改变窗口位置
import window from '@ohos.window'
interface Position {
x: number,
y: number
}
@Entry
@Component
struct Page {
@State message: string = 'Hello World'
private panOption: PanGestureOptions = new PanGestureOptions({ direction: PanDirection.All });
@State @Watch("moveWindow") windowPosition: Position = { x: 0, y: 0 };
floatWindow: window.Window
build() {
Row() {
Column() {
Text(this.message)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.backgroundColor(Color.Green)
.width("100%")
.height('100%')
.gesture(
PanGesture(this.panOption)
.onActionStart((event: GestureEvent) => {
console.info('Pan start');
})
.onActionUpdate((event: GestureEvent) => {
this.windowPosition.x += event.offsetX;
this.windowPosition.y += event.offsetY;
})
.onActionEnd(() => {
console.info('Pan end');
})
)
}
.width('100%')
}
.height('100%')
}
moveWindow() {
this.floatWindow.moveWindowTo(this.windowPosition.x, this.windowPosition.y);
}
aboutToAppear() {
this.floatWindow = window.findWindow("floatWindow")
}
}
// 还需注意 注册相关页面 src/main/resources/base/profile/main_pages.json
{
"src": [
"pages/Index",
"pages/Page"
]
}
在HarmonyOS鸿蒙Next系统中实现类似微信音视频通话悬浮窗的功能,可以通过以下步骤实现:
- 检查悬浮窗权限:首先,应用需要检查是否已获得悬浮窗权限,如未获得,则引导用户前往设置页面进行授权。
- 创建悬浮窗视图:使用WindowManager创建一个悬浮窗视图,并设置其布局参数,包括大小、位置以及类型(如TYPE_APPLICATION_OVERLAY)。
- 实现悬浮窗功能:悬浮窗应能响应用户的点击事件和拖拽操作。通过监听触摸事件,可以实现悬浮窗的拖拽移动,并根据用户的操作来调整悬浮窗的位置。
- 自适应布局:悬浮窗内的组件可以自适应布局,大小可以根据内部组件的大小进行自动调整,这对于实现视频小窗口播放等场景非常有用。
请注意,实现全局悬浮窗功能涉及系统级权限和复杂的视图管理,需严格遵循HarmonyOS的开发规范。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html 。