HarmonyOS鸿蒙Next中页面怎么实现切后台、失去焦点时模糊?

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

cke_281.jpeg


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

4 回复

效果图:

cke_47699.jpeg

首先,打开 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


在HarmonyOS Next中,页面切后台或失去焦点时实现模糊效果,可通过onPageHide生命周期回调配合window模块的模糊能力实现。在onPageHide中调用window.setWindowBlur()方法设置模糊效果,参数为模糊半径值。当页面重新显示时,在onPageShow中调用window.clearWindowBlur()清除模糊。此功能依赖系统窗口管理能力,需在module.json5中声明ohos.permission.SYSTEM_FLOAT_WINDOW权限。

在HarmonyOS Next中,可以通过监听应用窗口的焦点状态变化,并动态调整页面的模糊效果来实现切后台或失去焦点时的模糊效果。核心是使用window模块的焦点事件和graphics模块的模糊能力。

以下是实现步骤和关键代码示例:

  1. 获取窗口并监听焦点变化 在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}`);
      }
      // ... 其他初始化代码
    }
    
  2. 实现模糊效果组件 在需要模糊的页面组件(通常是根组件)中,使用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%')
      }
    }
    
  3. 通信与状态同步 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同步
      

注意事项:

  • 确保Blur组件覆盖整个可视区域。
  • 模糊效果对性能有一定影响,尤其是radius值较大时。建议根据实际需要调整。
  • onWindowStageDestroy生命周期中取消事件监听。
  • 此方法主要适用于应用内窗口。对于系统级全局模糊(如最近任务视图),由系统框架控制,开发者无法直接定制。

通过以上步骤,即可在HarmonyOS Next应用中实现类似“流心播放器隐私空间”页面在切后台时的模糊效果。

回到顶部