HarmonyOS 鸿蒙Next 怎么实现内部的渐变遮罩?

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 怎么实现内部的渐变遮罩?

我定义了一个可以横向滑动的Scroll组件,但是我希望他的父元素可以提供一个渐变的遮罩,当内容延伸到Scroll组件的外面时,遮罩可以出现在组件的边缘,形成一种可滚动的暗示

2 回复
  1. 通过overlay在当前组件上,添加遮罩的浮层效果。
  2. 再通过linearGradient设置颜色渐变。
  3. 使用blendMode让当前浮层与List混合实现渐变遮罩效果。

示例代码:

[@Entry](/user/Entry)
[@Component](/user/Component)
struct MaskDemo {
private arr: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9];

[@Builder](/user/Builder)
overlayBuilder() {
  Stack()
    .height('100%')
    .width('100%')
    .linearGradient({
      direction: GradientDirection.Bottom, // 渐变方向
      colors: [['#00FFFFFF', 0.0], ['#FFFFFFFF', 0.3]] // 数组末尾元素占比小于1时满足重复着色效果
    })
    .blendMode(BlendMode.DST_IN, BlendApplyType.OFFSCREEN)
    .hitTestBehavior(HitTestMode.None)
}

build() {
  Column() {
    List({ space: 20, initialIndex: 0 }) {
      ForEach(this.arr, (item: number) => {
        ListItem() {
          Text('' + item)
            .width('100%')
            .height(100)
            .fontSize(16)
            .textAlign(TextAlign.Center)
            .borderRadius(10)
            .backgroundColor(0xFFFFFF)
        }
        .onClick(() => {
          console.log('is click');
        })
      }, (item: string) => item)
    }
    .width('90%')
    .height('100%')
    .scrollBar(BarState.Off)
    .overlay(this.overlayBuilder())
    .blendMode(BlendMode.SRC_OVER, BlendApplyType.OFFSCREEN)
  }
  .width('100%')
  .height('100%')
  .backgroundColor(0xDCDCDC)
}
}

在HarmonyOS鸿蒙Next中实现内部的渐变遮罩,通常涉及使用Canvas和Paint对象进行自定义绘制。以下是实现步骤:

  1. 创建自定义组件:首先,创建一个自定义组件,该组件将负责绘制带有渐变遮罩的形状。
  2. 定义Shape和Gradient:在自定义组件中,定义所需的形状(如圆形、矩形等)以及渐变效果(线性渐变、径向渐变等)。使用Path对象来描述形状,Shader对象(如LinearGradient或RadialGradient)来定义渐变。
  3. 绘制遮罩:在onDraw方法中,创建Canvas对象,并使用Paint对象设置其Shader为之前定义的渐变Shader。然后,使用Canvas.clipPath方法应用形状遮罩。
  4. 结合绘制:使用Canvas.drawRect(或其他形状绘制方法)结合Paint对象进行绘制,此时绘制的内容将受到形状遮罩和渐变效果的影响。
  5. 调整参数:根据需要调整形状、渐变颜色、方向等参数,以达到期望的视觉效果。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部