HarmonyOS鸿蒙Next中window设置size,希望size之外的区域可点击

HarmonyOS鸿蒙Next中window设置size,希望size之外的区域可点击 window设置size,size之外的区域不可点击,希望window下的页面自己按钮等事件可以正常触发

3 回复

一、EntryAbility.ets的onWindowStageCreate中保存windowStage

import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';

export default class EntryAbility extends UIAbility {
    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    }

    onDestroy(): void {
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
    }

    onWindowStageCreate(windowStage: window.WindowStage): void {
        // Main window is created, set main page for this ability
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

        windowStage.loadContent('pages/Splash', (err, data) => {
            if (err.code) {
                hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
                return;
            }
            hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
        });

        // 此行为新增, 用于保存windowStage
        AppStorage.setOrCreate("windowStage", windowStage);
    }

    onWindowStageDestroy(): void {
        // Main window is destroyed, release UI related resources
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
    }

    onForeground(): void {
        // Ability has brought to foreground
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
    }

    onBackground(): void {
        // Ability has back to background
        hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
    }
}

二、Splash.ets的定时任务由你原先的showAlertWithPath改成我这里提供的showSubWindow。

aboutToAppear() {
    setTimeout(() => {
        // this.showAlertWithPath(this.context)
        this.showSubWindow()
    }, 4000)
}

// 采用子窗口
showSubWindow() {
    try {
        let windowStage = AppStorage.get("windowStage") as window.WindowStage;
        windowStage.createSubWindow("AlertDialogWindow", (err: BusinessError, windowClass) => {
            const errCode: number = err.code;
            if (errCode && (windowClass == null || windowClass == undefined)) {
                console.error('Failed to create the window. Cause: ' + JSON.stringify(err));
                return;
            }

            // 设置window大小
            windowClass.resize(display.getDefaultDisplaySync().width, vp2px(108));
            windowClass.loadContent('pages/Second', LocalStorage.getShared()).then(() => {
                windowClass?.setWindowBackgroundColor('#ffff0000')
            });

            windowClass.showWindow();
        });
    } catch (exception) {
        console.error('Failed to create the window. Cause: ' + JSON.stringify(exception));
    }
}

更多关于HarmonyOS鸿蒙Next中window设置size,希望size之外的区域可点击的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,设置窗口大小(size)并希望size之外的区域可点击,可以通过WindowWindowManager的相关API实现。首先,使用WindowsetSize方法设置窗口的大小。然后,通过WindowManagersetWindowAttributes方法,设置窗口的flags属性,使其能够响应点击事件。具体操作如下:

  1. 使用WindowsetSize方法设置窗口大小:
let window = new Window();
window.setSize({ width: 300, height: 200 });
  1. 使用WindowManagersetWindowAttributes方法,设置窗口的flags属性:
let windowManager = new WindowManager();
windowManager.setWindowAttributes(window, {
    flags: WindowFlag.WINDOW_FLAG_NOT_TOUCH_MODAL
});

通过以上设置,窗口之外的区域将能够响应点击事件。需要注意的是,WINDOW_FLAG_NOT_TOUCH_MODAL标志允许窗口之外的区域接收点击事件,而不会影响窗口本身的触摸事件。

在HarmonyOS鸿蒙Next中,如果你想设置窗口大小并允许窗口之外区域可点击,可以通过以下步骤实现:

  1. 设置窗口大小:使用WindowsetPreferredSize方法设置窗口的尺寸。
  2. 设置窗口属性:通过WindowsetFlags方法设置WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL标志,允许点击窗口之外的区域。

示例代码:

Window window = getWindow();
window.setPreferredSize(new Size(800, 600));
window.setFlags(WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL, WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL);

这样,窗口之外的区域仍然可以接收点击事件。

回到顶部