HarmonyOS鸿蒙Next中沉浸式顶部图片如何设置

HarmonyOS鸿蒙Next中沉浸式顶部图片如何设置 想做一个背景图,可以延伸到状态栏,下方渐变色和app主界面融为一体的效果,求大神解答!

4 回复

给图片设置height(‘auto’),让其自动适应内容高度
示例代码如下:

@Entry
@Component
struct page3 {
  build() {
    Column() {
      Image($r('app.media.startIcon')) // 资源文件需自行替换
        .width('100%')
        .objectFit(ImageFit.Contain)
        .height('auto')
        .backgroundColor(Color.Blue)
        .expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.TOP]);
    }
    .height('100%')
    .width('100%');
  }
}

【背景知识】

扩展其安全区域:expandSafeArea控制组件扩展其安全区域,实现屏幕整体一致,达成沉浸式体验。

更多关于HarmonyOS鸿蒙Next中沉浸式顶部图片如何设置的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


首先确定一下你的应用要使用哪种沉浸式,现在提供了两种方法:安全区 safeArea 和全屏扩展沉浸式,可见文档 开发应用沉浸式效果-组件布局-UI开发 (ArkTS声明式开发范式)-ArkUI(方舟UI框架)-应用框架 - 华为HarmonyOS开发者

safeArea的话,参考1楼的方法即可;全屏沉浸式的话需要先调用相关接口获取状态栏和导航栏高度,然后使用 padding 手动画布局做避让,比如

@Entry
@Component
struct Index {
  @State topAvoid: number = 0
  @State bottomAvoid: number = 0

  aboutToAppear() {
    // ...沉浸式相关代码,获取 topAvoid 和 bottomAvoid
  }

  build() {
    Stack() {
      // 背景图,撑满全屏
      Image(...)
      .width('100%').height('100%')

      Column() {
        // 内容区
      }.width('100%).height('100%')
      .padding({top: this.topAvoid, bottom: this.bottomAvoid})
      // 内容区通过 padding 避让导航栏和状态栏
    }.width('100%')
    .height('100%')
    // 根组件撑满全屏
  }
}

要做渐变色的话先用 colorPicker 从图片里取色,然后用 linearGradient 就行了,见 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-effectkit#effectkitcreatecolorpicker

如果有帮助点个采纳谢谢

在HarmonyOS Next中,设置沉浸式顶部图片需使用UIExtensionAbilityWindow组件。首先在module.json5中注册UIExtensionAbility,类型设为"window"。然后在onWindowStageCreate生命周期中,通过windowClass获取Window对象,调用setWindowSystemBarEnable方法启用系统栏,再使用setWindowSystemBarProperties设置statusBarContentColor为透明或指定颜色。图片资源通过Image组件加载,需设置fit属性为ImageFit.Cover确保适配。

在HarmonyOS Next中实现沉浸式顶部图片效果,可以通过以下步骤完成:

  1. 设置全屏模式
    AbilityonWindowStageCreate中调用:

    windowClass.setFullScreen(true)
    
  2. 配置页面布局
    使用Stack组件作为根容器,将背景图片设置为第一个子组件,并延伸至状态栏:

    Stack({ alignContent: Alignment.Top }) {
      Image($r('app.media.bg'))
        .width('100%')
        .height(/* 根据状态栏高度动态调整 */)
        .objectFit(ImageFit.Cover)
    
      // 主内容区域
      Column() {
        // 页面内容
      }
    }
    .width('100%')
    .height('100%')
    
  3. 添加渐变遮罩
    在图片上方使用LinearGradient实现底部渐变透明:

    Stack() {
      Image(...)
      Row()
        .linearGradient({
          angle: 180,
          colors: [['#00000000', '#000000FF']]
        })
        .height(80) // 渐变高度
    }
    
  4. 状态栏高度适配
    通过getSystemAvoidArea获取状态栏高度:

    import window from '[@ohos](/user/ohos).window';
    
    const avoidArea = window.getTopAvoidArea();
    const statusBarHeight = avoidArea.height;
    

关键点:

  • 使用Stack层叠布局实现图片与内容的叠加
  • 通过LinearGradient控制渐变区域透明度
  • 动态获取状态栏高度保证兼容性
  • 注意全屏模式下内容避让安全区域

这种方案能实现图片延伸至状态栏,同时通过渐变平滑过渡到主内容区域的效果。

回到顶部