HarmonyOS 鸿蒙Next中Span组件如何显示渐变色文字

HarmonyOS 鸿蒙Next中Span组件如何显示渐变色文字 rt, Text里面包含多个Span和ImageSpan,现在希望部分Span使用渐变色文字,应该怎么做。

6 回复

如何给Span组件设置渐变的背景颜色?

【背景知识】

  • Span:作为TextContainerSpan组件的子组件,用于显示行内文本的组件。不支持通用属性设置,所以linearGradient属性设置无效。若需设置通用属性,应使用Text进行设置,或改用属性字符串中的CustomSpan自行绘制。
  • CustomSpan可以通过setShaderEffect接口设置drawing.ShaderEffect.createLinearGradient实现渐变背景色。

【解决方案】

  • 方案一:CustomSpan方式实现Span渐变背景色。 参照设置自定义绘制Span示例六,核心代码修改如下:

原设置字体背景颜色代码:

brush.setColor({
  alpha: 255,
  red: 0,
  green: 74,
  blue: 175
});

改为渐变背景:

let startPt: common2D.Point = { x: 0, y: 0 };
let endPt: common2D.Point = { x: gUIContext.vp2px(this.width), y: gUIContext.vp2px(this.height) };
let shaderEffect =
  drawing.ShaderEffect.createLinearGradient(startPt, endPt, [0x3300FF00, 0x33FF0000], drawing.TileMode.REPEAT);
brush.setShaderEffect(shaderEffect)
  • 方案二:将文本绘制成图片显示。 通过drawing绘制出一张包含文字的渐变背景的图片,使用ImageSpan或者属性字符串的ImageAttachment显示文字图片。
import { common2D, drawing } from '@kit.ArkGraphics2D'
import { image } from '@kit.ImageKit'
import { LengthMetrics, MeasureText } from '@kit.ArkUI'

@Entry
@Component
struct DrawingSpanPage {
  textController: TextController = new TextController();
  @State pixelMap: image.PixelMap | undefined = undefined

  onPageShow() {
    this.draw() // 页面显示时绘制
  }

  build() {
    Row() {
      Column() {
        Text() {
          ImageSpan(this.pixelMap)
            .width(40)
            .height(16)
          Span(' World!')
            .baselineOffset(new LengthMetrics(0))
            .fontSize(16)
        }
        .height(16)
        .clip(true)
      }
      .width('100%')
    }
    .height('100%')
  }

  draw() {
    // 计算文本长款宽
    let size: SizeOptions =
      this.getUIContext().getMeasureUtils().measureTextSize({ textContent: 'Hello', fontSize: 16 })
    // 绘制图片
    const color = new ArrayBuffer(200 * 200 * 4);
    let opts: image.InitializationOptions = {
      editable: true,
      pixelFormat: 3,
      size: {
        height: size.height as number,
        width: size.width as number
      }
    }
    image.createPixelMap(color, opts).then((pixelMap: PixelMap) => {
      let width: number = size.width as number
      let height: number = size.height as number
      // 1.构造canvas对象
      const canvas = new drawing.Canvas(pixelMap);
      // 2.构造一个新的画刷对象,绘制背景
      const brush = new drawing.Brush()
      let startPt: common2D.Point = { x: 0, y: 0 };
      let endPt: common2D.Point = { x: width, y: height };
      let shaderEffect =
        drawing.ShaderEffect.createLinearGradient(startPt, endPt, [0x3300FF00, 0x33FF0000], drawing.TileMode.REPEAT);
      brush.setShaderEffect(shaderEffect)
      let path = new drawing.Path();
      const rect: common2D.Rect = {
        left: 0,
        top: 0,
        right: width,
        bottom: height
      };
      let roundRect = new drawing.RoundRect(rect, 0, 0);
      path.addRoundRect(roundRect, drawing.PathDirection.CLOCKWISE);
      canvas.clipPath(path, drawing.ClipOp.INTERSECT, true)
      canvas.drawBackground(brush)
      canvas.attachBrush(brush);
      canvas.drawPath(path)
      canvas.detachBrush();
      // 3.构造一个新的画刷对象,绘制文字
      const brush2 = new drawing.Brush()
      brush2.setColor({
        alpha: 255,
        red: 0,
        green: 0,
        blue: 0
      });
      const font = new drawing.Font();
      font.setSize(50);
      const textBlob = drawing.TextBlob.makeFromString('Hello', font, drawing.TextEncoding.TEXT_ENCODING_UTF8);
      canvas.attachBrush(brush2)
      canvas.drawTextBlob(textBlob, 0, height - this.getUIContext().vp2px(4)); // 设置文字位置
      canvas.detachBrush()
      this.pixelMap = pixelMap as PixelMap;
    })
  }
}

更多关于HarmonyOS 鸿蒙Next中Span组件如何显示渐变色文字的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


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

需要多行图文混排,用Text只能纯文字,

在HarmonyOS Next中,通过Span组件显示渐变色文字需使用TextDecorationforeground参数。具体实现:创建LinearGradient对象定义渐变色彩,将其设置为TextDecorationforeground属性,再通过TextSpandecoration参数应用。示例代码:

TextSpan({
  text: '渐变色文字',
  decoration: {
    type: TextDecorationType.None,
    foreground: new LinearGradient({
      angle: 90,
      colors: ['#FF0000', '#0000FF']
    })
  }
})

此方法直接在Span上渲染渐变效果,无需额外组件。

在HarmonyOS Next中,可以通过Text结合SpanforegroundStyle属性实现渐变色文字。具体步骤如下:

  1. 创建LinearGradient对象定义渐变色:
let gradient = new LinearGradient();
gradient.angle = 90; // 渐变角度
gradient.colors = [0xFF0000FF, 0x00FF00FF]; // 渐变色数组
  1. Span中应用渐变:
Span.create('渐变文字')
  .foregroundStyle(gradient)
  .fontSize(20)
  1. 完整示例:
Text.create() {
  Span.create('普通文字')
  Span.create('渐变文字')
    .foregroundStyle(
      new LinearGradient({
        angle: 90,
        colors: [0xFF0000FF, 0x00FF00FF]
      })
    )
}

注意:

  • 渐变色适用于单个Span,无法跨多个Span
  • 可调整angle控制渐变方向
  • colors数组支持多个颜色值
  • 渐变色与ImageSpan可同时使用
回到顶部