HarmonyOS 鸿蒙Next中如何控制壁纸背景是否可见

HarmonyOS 鸿蒙Next中如何控制壁纸背景是否可见 动画如何控制壁纸背景是否可见

4 回复

尊敬的开发者,您好,
请问您当前是否需要控制页面背景图片的显示与隐藏?若是此场景开发者可以参考下1楼的回复,若非是此场景,请您详细描述您需要实现的具体场景,以便分析具体问题给出适合的方案,感谢。

更多关于HarmonyOS 鸿蒙Next中如何控制壁纸背景是否可见的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


楼主是要控制背景图片是否可见吗?

可以参考以下方案:

  1. 通过条件渲染的方式控制背景图片是否显示:
@Entry
@Component
struct Index {
  @State isVisible: boolean = true;

  build() {
    Column() {
      Text('内容区域')
      Button(this.isVisible ? '隐藏背景' : '显示背景')
        .onClick(() => {
          this.isVisible = !this.isVisible;
        })
    }
    .width('100%')
    .height('100%')
    // 使用条件渲染控制背景图片
    .backgroundImage(
      this.isVisible ? $r('app.media.background') : '',
      ImageRepeat.NoRepeat
    )
    .backgroundImageSize({ width: '100%', height: '100%' })
  }
}
  1. 可以通过动态改变backgroundImage的参数实现显示隐藏背景图片:
@Entry
@Component
struct Index {
  @State bgImage: ResourceStr = $r('app.media.background');
  private emptyBg: ResourceStr = '';

  build() {
    Column() {
      Text('内容区域')
      Row({ space: 20 }) {
        Button('显示背景')
          .onClick(() => {
            this.bgImage = $r('app.media.background');
          })
        Button('隐藏背景')
          .onClick(() => {
            this.bgImage = this.emptyBg;
          })
      }
    }
    .width('100%')
    .height('100%')
    .backgroundImage(this.bgImage, ImageRepeat.NoRepeat)
    .backgroundImageSize({ width: '100%', height: '100%' })
  }
}
  1. 通过 Stack 组件叠加Image组件和容器组件实现图片背景,然后通过控制Image组件的显示实现:
@Entry
@Component
struct Index {
  @State isVisible: boolean = true;

  build() {
    Stack() {
      // 背景图片层
      Image($r('app.media.background'))
        .width('100%')
        .height('100%')
        .objectFit(ImageFit.Cover)
        .visibility(this.isVisible ? Visibility.Visible : Visibility.None)
      // 内容层
      Column() {
        Text('内容区域')
        Button(this.isVisible ? '隐藏背景' : '显示背景')
          .onClick(() => {
            this.isVisible = !this.isVisible;
          })
      }
      .width('100%')
      .height('100%')
    }
    .width('100%')
    .height('100%')
  }
}

需要添加动画的话可以参考这个demo:

@Entry
@Component
struct Index {
  @State bgOpacity: number = 1;

  build() {
    Stack() {
      // 背景图片层
      Image($r('app.media.background'))
        .width('100%')
        .height('100%')
        .objectFit(ImageFit.Cover)
        .opacity(this.bgOpacity)
      // 内容层
      Column({ space: 20 }) {
        Text('背景图片控制示例')
          .fontSize(24)
          .fontColor(Color.White)
        Row({ space: 20 }) {
          Button('显示背景')
            .onClick(() => {
              // 使用动画改变透明度
              animateTo({ duration: 300 }, () => {
                this.bgOpacity = 1;
              });
            })
          Button('隐藏背景')
            .onClick(() => {
              animateTo({ duration: 300 }, () => {
                this.bgOpacity = 0;
              });
            })
        }
      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
    }
    .width('100%')
    .height('100%')
  }
}

在 HarmonyOS Next 中,通过 Window 对象的 setWindowBackgroundBlur 方法控制壁纸背景的可见程度。传入 WindowBackgroundBlurStyle.OFF 使壁纸清晰可见;传入 THINMEDIUMTHICK 等模糊等级则逐渐模糊。若需完全隐藏壁纸,则在页面根容器设置不透明背景色(如 Color.White)。

在HarmonyOS Next中,壁纸背景的可见性由窗口的“壁纸背景模糊”属性和页面透明度共同控制。若要在动画中动态控制壁纸是否可见,可通过窗口API动态设置窗口的壁纸穿透效果,并结合页面背景的透明度变化实现。

具体而言,可在动画期间调用window.setWindowBackgroundBlur(boolean)调节壁纸模糊程度,或直接设置window.setWindowDimBehind(radius)来实现壁纸显现与隐藏的过渡。同时,将页面根容器的背景色设为带透明度的颜色,通过改变其alpha值即可让壁纸透过窗口显示或完全遮盖。动画过程中可逐帧更新这些属性,实现无缝的壁纸显隐动画效果。

回到顶部