HarmonyOS鸿蒙Next中如何在非Navigation组件上实现渐变模糊

HarmonyOS鸿蒙Next中如何在非Navigation组件上实现渐变模糊 HdsNavigation支持设置渐变模糊样式

🔗 UI Design Kit(UI设计套件)组件导航设置动态模糊样式

但是限定在了Navigation首页, 我希望在其他页面(NavigationDestination)或者普通组件上用渐变模糊的效果, 是否有办法实现呢?

5 回复

UI Design Kit提供了双边边缘流光与背景流光接口,可结合布局实现类似渐变模糊的视觉效果:

import { hdsEffect } from '@kit.UIDesignKit';

// 背景流光效果

Column() 

  .width('100%')

  .height(200)

  .backgroundEffect(hdsEffect.BackgroundFlow({

    colors: ['rgba(255,255,255,0.3)', 'rgba(200,200,200,0.6)'], // 渐变透明度

    angle: 90 // 渐变角度

  }))

在NavDestination中使用时,可通过覆写父级导航样式实现:

HdsNavDestination() {

  Column() {

    // 内容区组件

  }

  .backgroundEffect(hdsEffect.BackgroundFlow({

    colors: ['transparent', 'rgba(255,255,255,0.8)'],

    positions: [0.0, 1.0]

  }))

}

更多关于HarmonyOS鸿蒙Next中如何在非Navigation组件上实现渐变模糊的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢您的提问,为了更快解决您的问题,麻烦请补充以下信息:

问题现象:请问你咨询的是使用HdsNavigation组件的情况下,Navigation路由的二级及二级以上页面使用渐变模糊的效果,还是不使用HdsNavigation组件的情况下其他页面需要实现渐变模糊的效果。

复现代码:当前是什么场景无法实现渐变模糊的效果,是否可以提供复现问题demo,方便定位问题。

感谢支持与理解。

直接用不会触发吗?应该是一样的啊,

在HarmonyOS Next中,可通过@ohos.effectKit模块的blur方法实现非Navigation组件的渐变模糊。使用EffectManager.createBlurEffect()创建模糊效果,设置模糊半径和渐变参数,再通过component.effect()应用到组件上。支持动态调整模糊程度。

在HarmonyOS Next中,虽然HdsNavigation的渐变模糊效果主要针对首页,但您完全可以在其他页面或普通组件上实现类似的视觉效果。核心方法是使用RenderNodeBlur API进行离屏渲染模糊,并结合LinearGradientGraphicsBlurblurStyle参数来控制模糊区域的渐变。

以下是两种主要的实现思路和示例:

1. 使用RenderNodeBlur实现动态模糊背景 这是最灵活的方式,适用于任何自定义组件。您可以通过捕获底层内容的渲染节点,对其应用模糊效果,并作为背景。

import { RenderNodeBlur, BlurStyle, LinearGradient } from '@kit.ArkGraphics2D';

// 创建模糊渲染节点
let blurRenderNode = new RenderNodeBlur();
blurRenderNode.setBlurRadius(20); // 设置模糊半径
blurRenderNode.setBlurStyle(BlurStyle.THIN); // 设置模糊样式

// 在组件背景中应用
Column() {
  // 您的内容组件
}
.background(
  // 结合线性渐变实现从上到下的模糊强度变化
  LinearGradient.angle(90, [
    { color: '#00000040', offset: 0.0 },
    { color: '#00000010', offset: 0.3 },
    { color: '#00000000', offset: 1.0 }
  ]).blurEffect(blurRenderNode)
)

2. 结合GraphicsBlur与透明度渐变 对于需要模糊特定区域的情况,可以创建模糊效果层,并通过遮罩控制渐变。

// 创建模糊效果层
@Builder
function BlurOverlay() {
  Column()
    .width('100%')
    .height(100) // 模糊区域高度
    .background(
      // 使用GraphicsBlur并设置blurStyle
      GraphicsBlur.blurStyle(BlurStyle.REGULAR)
        .linearGradient(
          LinearGradient.angle(0, [
            { color: '#ffffff', offset: 0.0 },
            { color: '#ffffff00', offset: 1.0 }
          ])
        )
    )
}

// 在页面中使用
Column() {
  BlurOverlay()
  // 页面其他内容
}

关键点说明:

  • RenderNodeBlur提供了底层的模糊能力,性能较好,适合处理动态内容。
  • 通过LinearGradient控制颜色通道的透明度变化,可以实现平滑的模糊渐变效果。
  • 模糊半径和样式需要根据实际视觉需求调整,过大的模糊半径可能影响性能。
  • 如果模糊区域需要响应滚动等交互,建议结合ScrollSwiper组件的滚动事件动态更新模糊强度。

这两种方法都不依赖Navigation组件,您可以在任何ArkUI组件上实现渐变模糊效果。实际开发中,建议根据具体场景选择方案:静态背景或简单模糊区域可使用GraphicsBlur方案;需要动态模糊或复杂交互的场景,RenderNodeBlur方案更为合适。

回到顶部