HarmonyOS鸿蒙Next中BorderImage的渐变色设置怎么不生效呀?

HarmonyOS鸿蒙Next中BorderImage的渐变色设置怎么不生效呀? 我看API是支持的啊?但是实际效果却还是黑色的

Stack() {
  Image($r('app.media.icon_chorus_avatar_left'))
    .height('274lpx')
    .width('274lpx')
    .borderImage({source:{
      direction: GradientDirection.Bottom,
      colors: [['#D66AA4', 0], ['#8E214C', 1]]
    }})
    .borderWidth('10lpx')
    .borderRadius('137lpx')


}
.width('300lpx')
.margin({top:'80lpx'})

cke_204.png


更多关于HarmonyOS鸿蒙Next中BorderImage的渐变色设置怎么不生效呀?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

20 回复

开发者你好,需要确认下您这边想要实现的场景,是需要使用BorderImage属性,设置渐变色边框且设置圆角吗?请详细描述。

更多关于HarmonyOS鸿蒙Next中BorderImage的渐变色设置怎么不生效呀?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


开发者你好,可以参加以下代码实现。

@Entry
@Component
struct GradientBorderDemo {
  build() {
    Column() {
      Column() {
        Image($r('app.media.background'))
          .width('100%')
          .height('100%')
          .objectFit(ImageFit.Fill)
      }
      .width('100%')
      .height('100%')
      // .backgroundColor(Color.Black)
      .borderRadius(20)
      .justifyContent(FlexAlign.Center)
      .alignItems(HorizontalAlign.Center)
      .clip(true)
    }
    .linearGradient({
      direction: GradientDirection.Right,
      colors: [[0xFF00FF, 0.0], [0x00FFFF, 1.0]]
    })
    .borderRadius(20)
    .padding(3)
    .width('40%')
    .height('20%')
    .justifyContent(FlexAlign.Center)
  }
}

很喜欢HarmonyOS的卡片式设计,信息一目了然,操作也更便捷。

是要实现圆形头像的渐变色边框。我看这个BorderImage里有个linearGradient属性。 应该是可以的。但是发现不管用。我知道stack跌层能实现。那还有其他方案没

哈哈哈哈。牛逼。你这个还真行,不过还能优化,给你看看最终最精简的方案和效果

      Column() {
          Image($r('app.media.background'))
            .width('100%')
            .height('100%')
            .borderRadius('50%')
      }
      .linearGradient({
        direction: GradientDirection.Right,
        colors: [[0xFF00FF, 0.0], [0x00FFFF, 1.0]]
      })
      .borderRadius(200)
      .padding(10)
      .width(400)
      .height(400)
      .clip(true)

cke_161.png

orderImage 这里看起来“API 支持渐变”,但在很多版本/设备上 borderImage.source 实际只支持“图片资源(PixelMap/Resource)”,对你这种 LinearGradient 对象不会生效,最终就会退化成默认边框颜色(你看到的黑色/深色)。

另外还有两个容易踩的点:

  • borderImage 要想显示出来,通常需要 borderStyle 不是 none(有些版本默认 none,会导致你以为 borderImage 不生效)
  • 头像“圆形渐变边框”用 BorderImage 并不是最稳的实现方式

下面给你一个稳定可用的实现。


推荐方案:用两层圆形(外层渐变背景 + 内层图片裁圆)

外层做渐变“边框”,内层放头像并裁圆,间距就是边框宽度:

@Entry
@Component
struct Demo {
  build() {
    Stack() {
      // 外层:渐变圆环(用背景渐变做)
      Stack() {
        // 内层:头像
        Image($r('app.media.icon_chorus_avatar_left'))
          .width('254lpx')   // 外层 274 - 2*10 = 254
          .height('254lpx')
          .borderRadius('127lpx')
          .clip(true)
      }
      .width('274lpx')
      .height('274lpx')
      .borderRadius('137lpx')
      .padding('10lpx') // 边框厚度
      .backgroundColor({
        // 线性渐变
        direction: GradientDirection.Bottom,
        colors: [['#D66AA4', 0], ['#8E214C', 1]]
      })
    }
    .width('300lpx')
    .margin({ top: '80lpx' })
  }
}

这套实现的优点:

  • 不依赖 borderImage 的渐变支持情况,兼容性最好;
  • 圆形边框/圆形裁剪都很稳定;
  • 你要做“多段渐变/角向渐变”也能扩展(换成 radial/conic 之类如果版本支持)。

如果你坚持用 BorderImage(可尝试,但不保证)

你可以先补上(有些版本需要):

.borderStyle(BorderStyle.Solid)

但即使这样,多数情况下 borderImage.source 仍然只认图片,不认渐变对象。

边框图源仅适用于容器组件(Row/Column/Stack/Flex),在非容器组件(Image、Text 等)上使用会直接失效。你直接给Image组件加borderImage,系统根本不会渲染这个渐变边框,这是最核心的原因。

cke_523.jpeg

@Entry
@Component
struct GradientAvatarDemo2 {
  build() {
    Stack() {
      Image($r('app.media.car'))
        .width('274lpx')
        .height('274lpx')
        .borderRadius('137lpx')
        .objectFit(ImageFit.Cover)
    }
    .width('274lpx')
    .height('274lpx')
    .margin({ top: '80lpx' })
    .borderWidth('10lpx')
    .borderRadius('137lpx')
    .borderImage({
      source: {
        direction: GradientDirection.Bottom,
        colors: [['#D66AA4', 0.0], ['#8E214C', 1.0]]
      },
      slice: 10,
      outset: 0
      // ✅ 去掉 BorderImageRepeat,直接省略该参数,默认就是 Stretch
    })
  }
}

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17

borderImage 要生效至少需要配置 slice 和 width,并且官方说明里图片边框更偏“边框图源/渐变边框”能力,和普通 borderRadius、borderWidth 不是同一套渲染逻辑;做圆形头像渐变边框时,不建议继续强行用 borderImage + borderRadius 组合。更稳的是外层用 Circle/Column/Stack 做渐变背景,内层头像缩小并裁圆,例如外层 300,内层 274,中间差值就是边框宽度。这样圆角、裁剪、渐变都可控,跨版本表现也更稳定。

很喜欢HarmonyOS的卡片式设计,信息一目了然,操作也更便捷。

可以试试如下代码:

需要给borderImage属性加个slice,添加切割出来的图源宽高

同时还要设置边框宽度,并且隐藏边框本身的颜色

@Entry
@Component
struct Index {
  build() {
    Stack() {
      Column() {

      }
      .width(200)
      .height(200)
      .border({ width: 2, color: Color.Transparent })
      .borderImage({
        slice: 1,
        source: {
          direction: GradientDirection.Bottom,
          colors: [['#D66AA4', 0], ['#8E214C', 1]]
        }
      })
    }
    .width('100%')
    .height('100%')
  }
}

效果图如下

cke_16688.png

只能方形吗。border Radius都不能用的话。

slice我看也不是宽度之类的属性。好奇怪。这东西

貌似不能设置圆角,用其他办法也没用,cke_589.png

楼主,确实 borderImage 和 borderXXX 是互斥关系,设置了borderImage不能设置其他 borderXXX属性了。其他的不生效。

borderImage与 border(borderWidth、borderRadius)是两个互斥的属性,都是对边框样式处理,
这种混合类型只能叠层实现

Stack() { // 边框 Circle() .size({ width: ‘274lpx’, height: ‘274lpx’ }) .background(new LinearGradient({ direction: GradientDirection.Bottom, // 从下到上的渐变 colors: [ { offset: 0, color: Color.fromHex(’#D66AA4’) }, // 起始颜色:粉色 { offset: 1, color: Color.fromHex(’#8E214C’) } // 结束颜色:深红色 ] })) .scale({ x: 1.1, y: 1.1 }) // 原始的头像图片,居中显示 Image($r(‘app.media.icon_chorus_avatar_left’)) .height(‘274lpx’) .width(‘274lpx’) } .borderRadius(‘137lpx’) // 将容器裁剪为圆形 .width(‘300lpx’) .margin({ top: ‘80lpx’ })试试这个,

形状类组件不支持圆角和渐变色设置的,之前遇到过。叠层这种形式还是得用其他组件。我会弄叠层的方式。我只是奇怪为啥这个API不生效。

在HarmonyOS Next中,BorderImage 的渐变色需通过 linearGradientsweepGradient 等对象设置,并正确指定 fillModeImageFillMode.CLIPImageFillMode.REPEAT。若未生效,请检查渐变色参数格式(如 directioncolorsrepeating)是否符合ArkTS类型约束,以及 borderImageSource 是否被赋值为 Gradient 对象而非字符串。

问题出在 borderImagesource 没有用 LinearGradient 实例,而是直接传了普通对象,导致渐变解析失败,回退为黑色。同时缺少 slice 属性,边框无法正确切割渐变。
修正写法:

.borderImage({
  source: new LinearGradient([
    ['#D66AA4', 0],
    ['#8E214C', 1]
  ]),
  slice: 10 // 值与borderWidth一致
})

如有方向需求可指定 direction,例如 LinearGradient 的构造也支持 { direction: GradientDirection.Bottom, colors: ... }slice 必须设置,否则渐变不会显示在边框上。

回到顶部