HarmonyOS鸿蒙Next中是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码?
HarmonyOS鸿蒙Next中是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码? 是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码?
希望通过悬浮窗口实现点击后弹出二级悬浮窗口,实现不同功能的测试采集。
1、首先需要在EntryAbility.ets中将windowStage保存起来,在onWindowStageCreate方法中,添加如下代码:
AppStorage.setOrCreate("windowStage", windowStage);
2、新建一个页面Index.ets,在页面中点击创建子窗口按钮,出现子窗口页面,做成悬浮窗的样式
3、点击第一个子窗口(悬浮窗),根据需要创建多个其他的子窗口(做成悬浮窗的样式)
具体demo如下:
// 1、Index.ets页面
import { window } from '@kit.ArkUI'
import { createSubWindow, SubWindow } from './utils'
@Component
struct IndexPage {
@State windowStage: window.WindowStage = AppStorage.get("windowStage") as window.WindowStage
build() {
Row() {
Column() {
Button("创建子窗口", { stateEffect: true, type: ButtonType.Capsule })
.width('80%')
.height(40)
.margin(20)
.onClick(() => {
let data: SubWindow = new SubWindow('subWinOne', 'pages/SubWindow/SubWinOne', 0, 640, vp2px(70), vp2px(70))
createSubWindow(this.windowStage, data)
})
}
.width('100%')
}
.height('100%')
}
}
// 2、SubWinOne.ets 第一个子窗口
import { window } from '@kit.ArkUI';
import { createSubWindow, SubWindow } from './utils';
@Component
struct SubWinOne {
@State windowStage: window.WindowStage = AppStorage.get("windowStage") as window.WindowStage;
@State subWindowList: SubWindow[] = [
new SubWindow('subWinTwo', 'pages/SubWindow/SubWinTwo', 100, 400, vp2px(50), vp2px(50)),
new SubWindow('subWinThree', 'pages/SubWindow/SubWinThree', 280, 660, vp2px(50), vp2px(50)),
new SubWindow('subWinFour', 'pages/SubWindow/SubWinFour', 100, 930, vp2px(50), vp2px(50))
]
onPageShow(): void {
setTimeout(() => {
// 获取子窗口ID
let subWindowID: number = window.findWindow("subWinOne").getWindowProperties().id
// 获取主窗口ID
let mainWindowID: number = this.windowStage.getMainWindowSync().getWindowProperties().id
// 将焦点从子窗口转移到主窗口
window.shiftAppWindowFocus(subWindowID, mainWindowID)
}, 500)
}
build() {
Row() {
Column() {
Text('鹰巢').fontColor(Color.White)
.onClick(() => {
for (let i = 0; i < this.subWindowList.length; i++) {
createSubWindow(this.windowStage, this.subWindowList[i])
}
})
}
.width('100%')
}
.height('100%')
.backgroundColor(Color.Orange)
.borderRadius(40)
}
}
// 3、SubWinTwo.ets 第二个子窗口(SubWinThree、SubWinFour是一样的,就不贴上来了)
import { window } from '@kit.ArkUI';
@Component
struct SubWinTwo {
@State windowStage: window.WindowStage = AppStorage.get("windowStage") as window.WindowStage;
onPageShow(): void {
setTimeout(() => {
// 获取子窗口ID
let subWindowID: number = window.findWindow("subWinTwo").getWindowProperties().id
// 获取主窗口ID
let mainWindowID: number = this.windowStage.getMainWindowSync().getWindowProperties().id
// 将焦点从子窗口转移到主窗口
window.shiftAppWindowFocus(subWindowID, mainWindowID)
}, 500)
}
build() {
Row() {
Column() {
Text('录像').fontColor(Color.White)
}
.width('100%')
}
.height('100%')
.backgroundColor(Color.Orange)
.borderRadius(40)
}
}
// 4、utils.ets (公共方法和类)
import { window } from '@kit.ArkUI';
export class SubWindow {
subWindowName: string = ''
pagePath: string = ''
posX: number = 0
posY: number = 0
windowWidth: number = 0
windowHeight: number = 0
constructor(subWindowName: string, pagePath: string, posX: number, posY: number, windowWidth: number, windowHeight: number) {
this.subWindowName = subWindowName
this.pagePath = pagePath
this.posX = posX
this.posY = posY
this.windowWidth = windowWidth
this.windowHeight = windowHeight
}
}
export function createSubWindow(windowStage: window.WindowStage, subWindowInfo: SubWindow) {
windowStage.createSubWindow(subWindowInfo.subWindowName, (err, windowClass) => {
if (err.code > 0) {
return;
}
try {
windowClass.setUIContent(subWindowInfo.pagePath, () => {
windowClass.setWindowBackgroundColor('#00000000')
});
// 设置子窗口左上角坐标
windowClass.moveWindowTo(subWindowInfo.posX, subWindowInfo.posY)
// 设置子窗口大小
windowClass.resize(subWindowInfo.windowWidth, subWindowInfo.windowHeight)
// 展示子窗口
windowClass.showWindow();
// 设置子窗口全屏化布局不避让安全区
// windowClass.setWindowLayoutFullScreen(true);
} catch (err) {
console.error("failed to create subWindow Cause:" + err)
}
})
}
更多关于HarmonyOS鸿蒙Next中是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS(鸿蒙)Next中,确实支持悬浮窗口和二级菜单悬浮窗口的实现。鸿蒙提供了Window和WindowStage等API来管理窗口的创建、显示和交互。开发者可以通过这些API来实现悬浮窗口的功能。
具体实现悬浮窗口的步骤如下:
- 创建悬浮窗口:使用
Window类的createWindow方法创建一个新的窗口实例。 - 设置窗口属性:通过
Window的setWindowAttributes方法设置窗口的尺寸、位置、透明度等属性。 - 显示窗口:调用
Window的showWindow方法将窗口显示在屏幕上。 - 处理窗口交互:通过监听窗口的事件(如点击、拖动等)来实现交互逻辑。
以下是一个简单的悬浮窗口实现代码示例:
import { Window, WindowStage } from '@ohos.window';
// 创建悬浮窗口
let windowStage: WindowStage = await WindowStage.create("floatingWindow");
let window: Window = await windowStage.getMainWindow();
// 设置窗口属性
await window.setWindowAttributes({
width: 300,
height: 200,
x: 100,
y: 100,
type: Window.Type.TYPE_FLOATING
});
// 显示窗口
await window.showWindow();
// 处理窗口交互
window.on('click', () => {
console.log("悬浮窗口被点击");
});
对于二级菜单悬浮窗口,可以通过在悬浮窗口中再创建一个子窗口或使用Popup组件来实现。具体实现方式与上述悬浮窗口类似,但需要根据业务逻辑进行适当的调整。
总之,鸿蒙Next提供了丰富的API和组件来支持悬浮窗口和二级菜单悬浮窗口的实现,开发者可以根据需求灵活使用。
在HarmonyOS鸿蒙Next中,确实支持悬浮窗口功能,可以通过WindowManager和Window类来实现。以下是一个简单的悬浮窗口实现样例代码:
// 创建WindowManager
WindowManager windowManager = getSystemService(Context.WINDOW_SERVICE);
// 创建Window.LayoutParams
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
// 创建悬浮窗口视图
View floatingView = LayoutInflater.from(this).inflate(R.layout.floating_layout, null);
// 添加悬浮窗口
windowManager.addView(floatingView, layoutParams);
其中,TYPE_APPLICATION_OVERLAY用于指定悬浮窗口类型,FLAG_NOT_FOCUSABLE确保悬浮窗口不会获得焦点。你可以根据需要调整布局和参数。

