在HarmonyOS NEXT开发中实现给一个View添加Mask遮罩,其中Mask为一个带透明度的图片?

在HarmonyOS NEXT开发中实现给一个View添加Mask遮罩,其中Mask为一个带透明度的图片?

阅读 841
avatarAI BotBETA

在 HarmonyOS NEXT 的 ArkUI 开发中,可以通过 Stack + BlendMode 组合实现图片遮罩效果。核心思路是通过混合模式将图片的 Alpha 通道作为遮罩层。以下是实现步骤:


1. 基础实现方案

// 目标组件(被遮罩的View)
@Entry
@Component
struct MaskExample {
  build() {
    Stack() {
      // 原始内容(被遮罩的部分)
      Column() {
        Text("Hello HarmonyOS")
          .fontSize(20)
          .fontColor(Color.White)
      }
      .width('100%')
      .height('100%')
      .backgroundColor(Color.Blue)

      // 遮罩层(带透明通道的图片)
      Image($r('app.media.mask_image')) // 替换为你的遮罩图片资源
        .width('100%')
        .height('100%')
        .objectFit(ImageFit.Fill)
        .opacity(0.7) // 调整遮罩整体透明度
        .blendMode(BlendMode.DstIn) // 关键混合模式
    }
    .width(300)
    .height(300)
  }
}

2. 关键参数说明

  • blendMode(BlendMode.DstIn)
    使用目标输入模式,将图片的 Alpha 通道作为遮罩形状,透明区域会隐藏下层内容。
  • opacity()
    控制遮罩图片整体透明度(0.0~1.0),实现半透明遮罩效果。
  • 图片资源要求
    遮罩图片需带 Alpha 通道(如 PNG 格式),透明区域定义遮罩形状,非透明区域定义保留区域。

3. 动态遮罩进阶

若需要动态调整遮罩,可通过状态管理实现:

@State maskOpacity: number = 0.7

build() {
  Stack() {
    // ...原始内容

    Image($r('app.media.mask_image'))
      .opacity(this.maskOpacity)
      .blendMode(BlendMode.DstIn)
      .onClick(() => {
        this.maskOpacity = this.maskOpacity > 0 ? 0 : 0.7 // 点击切换遮罩显隐
      })
  }
}

4. 注意事项

  • 使用前需在 resources/base/media/ 目录放置遮罩图片
  • 混合模式需根据实际效果调整,常用模式:DstIn(遮罩形状)、SrcOver(普通叠加)
  • 对于复杂形状遮罩,建议使用矢量图形(.svg)替代位图以获得更好缩放效果

可通过调整 blendMode 和图片透明度实现类似蒙版、渐变遮罩等效果。

1 个回答

参考demo:

@Entry 
@Component 
struct Index { 
  build() { 
    Column() { 
      Stack() { 
        Column() { 
          Column() { 
            Image($r("app.media.background")) 
              .width('100%') 
 
          } 
          .blendMode(BlendMode.SRC_IN, BlendApplyType.OFFSCREEN) 
          .backgroundColor(Color.Transparent) 
          .width('100%') 
          .height('100%') 
        } 
        .width('100%') 
        .height('40%') 
        .linearGradient({ 
          angle: 180, 
          // rgba(0, 0, 0, 0) 表示一种完全透明的颜色,其中最后一个参数 alpha(透明度)值为 0,表示该颜色是完全透明的 
          colors: [['rgba(0, 0, 0, 1)', 0.9], ['rgba(0, 0, 0, 0)', 1]] 
        }) 
        .blendMode(BlendMode.SRC_OVER, BlendApplyType.OFFSCREEN) 
      } 
    } 
    .width("100%") 
  } 
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进