HarmonyOS鸿蒙Next中是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码?

HarmonyOS鸿蒙Next中是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码? 是否具有悬浮窗口/二级菜单悬浮窗口的组件和样例代码?

希望通过悬浮窗口实现点击后弹出二级悬浮窗口,实现不同功能的测试采集。

3 回复

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中,确实支持悬浮窗口和二级菜单悬浮窗口的实现。鸿蒙提供了WindowWindowStage等API来管理窗口的创建、显示和交互。开发者可以通过这些API来实现悬浮窗口的功能。

具体实现悬浮窗口的步骤如下:

  1. 创建悬浮窗口:使用Window类的createWindow方法创建一个新的窗口实例。
  2. 设置窗口属性:通过WindowsetWindowAttributes方法设置窗口的尺寸、位置、透明度等属性。
  3. 显示窗口:调用WindowshowWindow方法将窗口显示在屏幕上。
  4. 处理窗口交互:通过监听窗口的事件(如点击、拖动等)来实现交互逻辑。

以下是一个简单的悬浮窗口实现代码示例:

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中,确实支持悬浮窗口功能,可以通过WindowManagerWindow类来实现。以下是一个简单的悬浮窗口实现样例代码:

// 创建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确保悬浮窗口不会获得焦点。你可以根据需要调整布局和参数。

回到顶部