HarmonyOS鸿蒙Next中页面怎么实现切后台、失去焦点时模糊?
HarmonyOS鸿蒙Next中页面怎么实现切后台、失去焦点时模糊? 比如流心播放器的隐私空间页面,切后台时的效果。

更多关于HarmonyOS鸿蒙Next中页面怎么实现切后台、失去焦点时模糊?的实战教程也可以访问 https://www.itying.com/category-93-b0.html
效果图:

首先,打开 entry/src/main/ets/pages/Index.ets,增加以下内容。
import { UIUtils } from '@kit.ArkUI';
class PrivacyBackgroundUtil {
public isPrivacyBackground: boolean = false
}
export const Privacy = UIUtils.makeObserved(new PrivacyBackgroundUtil());
@Entry
@ComponentV2
struct BlurPage {
build() {
Column() {
Text('Hello World')
.fontSize(50)
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
.backgroundColor('#36ffffff')
.blur(Privacy.isPrivacyBackground ? 1000 : 0)
}
}
然后,打开 entry/src/main/ets/entryability/EntryAbility.ets。
- 增加 import。
import { Privacy } from '../pages/Index';
- 然后找到 onWindowStageCreate 增加 windowStageEvent 事件监听。
windowStage.loadContent('pages/Index', (err) => {
windowStage.on('windowStageEvent', async (windowEvent) => {
switch (windowEvent) {
case window.WindowStageEventType.SHOWN:
case window.WindowStageEventType.ACTIVE:
case window.WindowStageEventType.RESUMED: {
Privacy.isPrivacyBackground = false
break
}
case window.WindowStageEventType.HIDDEN:
case window.WindowStageEventType.PAUSED:
case window.WindowStageEventType.INACTIVE: {
Privacy.isPrivacyBackground = true
break
}
}
})
}

更多关于HarmonyOS鸿蒙Next中页面怎么实现切后台、失去焦点时模糊?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
6666
在HarmonyOS Next中,页面切后台或失去焦点时实现模糊效果,可通过onPageHide生命周期回调配合window模块的模糊能力实现。在onPageHide中调用window.setWindowBlur()方法设置模糊效果,参数为模糊半径值。当页面重新显示时,在onPageShow中调用window.clearWindowBlur()清除模糊。此功能依赖系统窗口管理能力,需在module.json5中声明ohos.permission.SYSTEM_FLOAT_WINDOW权限。
在HarmonyOS Next中,可以通过监听应用窗口的焦点状态变化,并动态调整页面的模糊效果来实现切后台或失去焦点时的模糊效果。核心是使用window模块的焦点事件和graphics模块的模糊能力。
以下是实现步骤和关键代码示例:
-
获取窗口并监听焦点变化 在UIAbility的
onWindowStageCreate生命周期中,获取应用窗口并注册焦点事件监听。import { window } from '@kit.ArkUI'; import { BusinessError } from '@kit.BasicServicesKit'; onWindowStageCreate(windowStage: window.WindowStage): void { // 获取主窗口 let mainWindow: window.Window = windowStage.getMainWindow(); // 监听窗口焦点变化事件 try { mainWindow.on('windowFocus', (hasFocus: boolean) => { // hasFocus为false表示窗口失去焦点(如切后台) this.handleWindowFocusChange(hasFocus); }); } catch (error) { console.error(`Failed to register focus event. Code: ${(error as BusinessError).code}, message: ${(error as BusinessError).message}`); } // ... 其他初始化代码 } -
实现模糊效果组件 在需要模糊的页面组件(通常是根组件)中,使用
Blur组件。通过一个状态变量(例如isBlurred)来控制模糊效果的开启与关闭。import { Blur } from '@kit.ArkGraphics2D'; @Entry @Component struct PrivacyPage { // 控制模糊效果的状态变量 @State isBlurred: boolean = false; // 此方法由UIAbility中的事件监听器调用,需通过公共事件或AppStorage等方式通信 setBlurEffect(blur: boolean) { this.isBlurred = blur; } build() { Stack({ alignContent: Alignment.TopStart }) { // 你的页面主要内容 Column() { // ... 页面具体内容 } // 模糊效果层:失去焦点时覆盖在内容上方 if (this.isBlurred) { Blur({ // 调整radius值控制模糊程度 radius: 20, // 可选:添加一个半透明遮罩层增强效果 color: 'rgba(255, 255, 255, 0.1)' }) .width('100%') .height('100%') } } .width('100%') .height('100%') } } -
通信与状态同步 UIAbility中监听到的焦点变化需要通知到页面组件。可以通过以下方式实现状态同步:
- 使用AppStorage(推荐): 将
isBlurred状态存入AppStorage,页面组件和UIAbility同时监听或修改此状态。 - 使用Emitter: 通过事件总线发送焦点变化事件。
- 通过UIAbilityContext: 在页面中获取UIAbilityContext并调用其方法。
以AppStorage为例:
- 在UIAbility中修改状态:
import { AppStorage } from '@kit.ArkUI'; handleWindowFocusChange(hasFocus: boolean): void { // 失去焦点时设置为true,触发模糊 AppStorage.setOrCreate('isWindowBlurred', !hasFocus); } - 在页面组件中链接状态:
@StorageLink('isWindowBlurred') isBlurred: boolean = false; // 现在可以直接使用this.isBlurred,它会自动与AppStorage同步
- 使用AppStorage(推荐): 将
注意事项:
- 确保
Blur组件覆盖整个可视区域。 - 模糊效果对性能有一定影响,尤其是
radius值较大时。建议根据实际需要调整。 - 在
onWindowStageDestroy生命周期中取消事件监听。 - 此方法主要适用于应用内窗口。对于系统级全局模糊(如最近任务视图),由系统框架控制,开发者无法直接定制。
通过以上步骤,即可在HarmonyOS Next应用中实现类似“流心播放器隐私空间”页面在切后台时的模糊效果。

