harmony 鸿蒙字块绘制(ArkTS)

  • 2025-06-12
  • 浏览 (7)

字块绘制(ArkTS)

场景介绍

字块(TextBlob)是指文本的集合。无论是单个的文字还是大块的文本,都可以通过字块来绘制。

除了基本的字块绘制之外,还可以给文字添加各种绘制效果。常见的字块绘制场景包括文字描边文字渐变等,更多效果请见绘制效果

本节不涉及文本测量和布局排版相关内容,如需在开发中处理此类文本绘制需求,可参考文本开发概述,该文档系统讲解了排版策略与相关使用指导。

基本字块绘制

Canvas通过drawTextBlob()来绘制字块。函数接受三个参数:TextBlob字块对象,以及文字基线左端点的x坐标和y坐标。

画布Canvas对象具体可见画布的获取与绘制结果的显示(ArkTS)

字块对象可以通过多种方式创建得到,详细的字块创建方式和接口使用请参考TextBlob

此处以使用makeFromString()接口创建字块为例,接口接受3个参数,分别为:

  • 需要显示的字符串text。

  • font字型对象。其中font用于设置和获取字体的各种属性,如字体大小、文本样式、字体对齐方式、字体渲染方式、字体描边方式等,详细的API介绍请参考Font

  • 文本编码方式。当前支持的文本编码方式如下:

    • TEXT_ENCODING_UTF8:使用1个字节表示UTF-8或ASCII;
    • TEXT_ENCODING_UTF16:使用2个字节表示大部分unicode;
    • TEXT_ENCODING_UTF32:使用4个字节表示全部unicode;
    • TEXT_ENCODING_GLYPH_ID:使用2个字节表示glyph index。

基本效果的示例代码和效果图如下:

// 创建字型对象
const font = new drawing.Font();
// 设置字体大小
font.setSize(100);
// 创建字块对象
const textBlob = drawing.TextBlob.makeFromString('Hello world', font, drawing.TextEncoding.TEXT_ENCODING_UTF8);
// 绘制字块
canvas.drawTextBlob(textBlob, 200, 300);

Screenshot_20241225151030139

文字描边

基于基本的字块绘制,还可以通过画笔实现文字描边效果,描边效果的更多介绍请参考描边效果

文字描边的简要示例和示意图如下:

// 创建画笔
let pen = new drawing.Pen();
// 设置抗锯齿
pen.setAntiAlias(true);
// 设置描边线宽
pen.setStrokeWidth(3.0);
// 设置描边颜色
pen.setColor(0xFF, 0xFF,  0x00, 0x00);
// 创建字型对象
const font = new drawing.Font();
// 设置字体大小
font.setSize(100);
// 添加画笔描边效果
canvas.attachPen(pen);
// 创建字块对象
const textBlob = drawing.TextBlob.makeFromString('Hello world', font, drawing.TextEncoding.TEXT_ENCODING_UTF8);
// 绘制字块
canvas.drawTextBlob(textBlob, 200, 300);
// 去除描边效果
canvas.detachPen();

Screenshot_20241225152446749

文字渐变

基于基本字块绘制,还可以通过着色器实现文字渐变的效果,着色器的更多介绍请参考着色器效果

以下为文字添加了线性渐变着色器效果的简要示例和示意图:

let startPt: common2D.Point = { x: 100, y: 100 };
let endPt: common2D.Point = { x: 900, y: 900 };
let colors = [0xFFFFFF00, 0xFFFF0000, 0xFF0000FF];
// 创建线性渐变着色器
let shaderEffect = drawing.ShaderEffect.createLinearGradient(startPt, endPt, colors, drawing.TileMode.CLAMP);
// 创建画刷
let brush = new drawing.Brush();
// 设置着色器
brush.setShaderEffect(shaderEffect);
// 添加画刷填充效果
canvas.attachBrush(brush);
// 创建字型
const font = new drawing.Font();
// 设置字体大小
font.setSize(200);
// 创建字块
const textBlob = drawing.TextBlob.makeFromString('Hello world', font, drawing.TextEncoding.TEXT_ENCODING_UTF8);
// 绘制字块
canvas.drawTextBlob(textBlob, 100, 300);
// 去除填充效果
canvas.detachBrush();

Screenshot_20241225155707415

主题字体

主题字体,特指系统主题应用中能使用的字体,属于一种特殊的自定义字体。如需涉及文本测量和布局排版相关内容,可参考使用主题字体(ArkTS)

设置跟随主题字体的示例代码和效果图如下:

// 创建字型对象
const font = new drawing.Font();
// 设置文字大小
font.setSize(100);
// 设置跟随主题字体
font.setThemeFontFollowed(true);
// 创建字块对象
const textBlob = drawing.TextBlob.makeFromString('Hello World', font, drawing.TextEncoding.TEXT_ENCODING_UTF8);
// 绘制字块
canvas.drawTextBlob(textBlob, 200, 300);
未跟随主题字体的效果图 跟随主题字体的效果图(不同主题字体显示效果不同,此处仅示意)
Snapshot_setThemeFontFollowed_sys Snapshot_setThemeFontFollowed

说明

需要在应用入口文件(默认工程中为EntryAbility.ets)中复写onConfigurationUpdate函数,以响应切换主题字体的操作,确保切换后页面能够及时刷新并生效。具体实现可参考使用主题字体(ArkTS)

单字绘制

相比字块绘制,单字绘制的优势在于能够利用字体退化机制,在当前字体无法显示某字符时,自动退化到使用系统字体绘制字符,从而提升对特殊字符的兼容性,避免字符缺失,增强用户体验。详细API说明请见drawing.Canvas

单字绘制的示例代码和效果图如下:

// 创建字型对象
const font = new drawing.Font();
// 设置文字大小
font.setSize(100);
let startX = 100;
let startY = 100;
let text = ['H', 'e', 'l', 'l', 'o'];
for (let s of text) {
  // 单字绘制
  canvas.drawSingleCharacter(s, font, startX, startY);
  // 测量单个字符的宽度
  let textWidth = font.measureSingleCharacter(s);
  startX += textWidth;
}

Snapshot_drawSingleCharacter

相关实例

针对Drawing(ArkTS)的开发,有以下相关实例可供参考:

你可能感兴趣的鸿蒙文章

harmony 鸿蒙ArkGraphics 2D(方舟2D图形服务)

harmony 鸿蒙ArkGraphics 2D简介

harmony 鸿蒙基础绘制效果(ArkTS)

harmony 鸿蒙基础绘制效果(C/C++)

harmony 鸿蒙画布的获取与绘制结果的显示(ArkTS)

harmony 鸿蒙画布的获取与绘制结果的显示(C/C++)

harmony 鸿蒙画布操作及状态处理(ArkTS)

harmony 鸿蒙画布操作及状态处理(C/C++)

harmony 鸿蒙复杂绘制效果(ArkTS)

harmony 鸿蒙复杂绘制效果(C/C++)

0  赞