• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 字块绘制(C/C++)
2
3## 场景介绍
4
5字块(TextBlob)是指文本的集合。无论是单个的文字还是大块的文本,都可以通过字块来绘制。
6
7本节聚焦于文字的绘制效果,更多关于文本测量、排版的场景指导,可见[文本开发概述](text-overview.md)。
8
9除了基本的字块绘制之外,还可以给文字添加各种绘制效果。常见的字块绘制场景包括[文字描边](#文字描边)、[文字渐变](#文字渐变)等,更多效果请见[绘制效果](drawing-effect-overview.md)。
10
11## 基本字块绘制
12
13使用OH_Drawing_CanvasDrawTextBlob()接口绘制字块,接口接受4个参数,分别为:画布Canvas对象、字块对象、文字基线左端点的x坐标和y坐标。
14
15画布Canvas对象具体可见[画布的获取与绘制结果的显示(C/C++)](canvas-get-result-draw-c.md)。
16
17字块对象可以通过多种方式创建得到,详细的字块创建方式请参考[drawing_text_blob.h](../reference/apis-arkgraphics2d/drawing__text__blob_8h.md)。
18
19此处以使用OH_Drawing_TextBlobCreateFromString()接口创建字块为例,接口接受3个参数,分别为:
20
21- 需要显示的文本字符串内容。
22
23- 指向OH_Drawing_Font字体对象的指针。OH_Drawing_Font用于设置和获取字体的各种属性,如字体大小、文本样式、字体对齐方式、字体渲染方式、字体描边方式等,详细的API介绍请参考[draw_font](../reference/apis-arkgraphics2d/drawing__font_8h.md)。
24
25- 文本编码方式。
26
27简单示例和示意图如下所示:
28
29```c++
30// 创建字体对象
31OH_Drawing_Font *font = OH_Drawing_FontCreate();
32// 设置字体大小
33OH_Drawing_FontSetTextSize(font, 100);
34// 需要绘制的文字
35const char *str = "Hello world";
36// 创建字块对象
37OH_Drawing_TextBlob *textBlob =
38    OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
39// 绘制字块
40OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 200, 800);
41// 释放字块对象
42OH_Drawing_TextBlobDestroy(textBlob);
43// 释放字体对象
44OH_Drawing_FontDestroy(font);
45```
46
47![Screenshot_20241225164926098](figures/Screenshot_20241225164926098.jpg)
48
49## 文字描边
50
51基于基本的字块绘制,还可以通过画笔实现文字描边效果,描边效果的更多介绍请参考[描边效果](basic-drawing-effect-c.md#描边效果)。
52
53文字描边的简要示例和示意图如下:
54
55```c++
56// 创建画笔
57OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
58// 设置抗锯齿
59OH_Drawing_PenSetAntiAlias(pen, true);
60// 设置描边颜色
61OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(0xFF, 0xFF, 0x00, 0x00));
62// 设置描边线宽
63OH_Drawing_PenSetWidth(pen, 3);
64// 设置画笔描边效果
65OH_Drawing_CanvasAttachPen(canvas, pen);
66// 创建字型对象
67OH_Drawing_Font *font = OH_Drawing_FontCreate();
68// 设置字体大小
69OH_Drawing_FontSetTextSize(font, 150);
70const char *str = "Hello world";
71// 创建字块对象
72OH_Drawing_TextBlob *textBlob =
73    OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
74// 绘制字块
75OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 200, 800);
76// 去除描边效果
77OH_Drawing_CanvasDetachPen(canvas);
78// 销毁各类对象
79OH_Drawing_TextBlobDestroy(textBlob);
80OH_Drawing_FontDestroy(font);
81OH_Drawing_PenDestroy(pen);
82```
83
84![Screenshot_20241225171259621](figures/Screenshot_20241225171259621.jpg)
85
86## 文字渐变
87
88基于基本字块绘制,还可以通过着色器实现文字渐变的效果,着色器的更多介绍请参考[着色器效果](complex-drawing-effect-c.md#着色器效果)。
89
90以下为文字添加了线性渐变着色器效果的简要示例和示意图:
91
92```c++
93// 开始点
94OH_Drawing_Point *startPt = OH_Drawing_PointCreate(100, 100);
95// 结束点
96OH_Drawing_Point *endPt = OH_Drawing_PointCreate(900, 900);
97// 颜色数组
98uint32_t colors[] = {0xFFFFFF00, 0xFFFF0000, 0xFF0000FF};
99// 相对位置数组
100float pos[] = {0.0f, 0.5f, 1.0f};
101// 创建线性渐变着色器效果
102OH_Drawing_ShaderEffect *colorShaderEffect =
103    OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, colors, pos, 3, OH_Drawing_TileMode::CLAMP);
104// 创建画刷对象
105OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
106// 基于画刷设置着色器效果
107OH_Drawing_BrushSetShaderEffect(brush, colorShaderEffect);
108// 设置画刷填充效果
109OH_Drawing_CanvasAttachBrush(canvas, brush);
110// 创建字型对象
111OH_Drawing_Font *font = OH_Drawing_FontCreate();
112// 设置字体大小
113OH_Drawing_FontSetTextSize(font, 150);
114const char *str = "Hello world";
115// 创建字块对象
116OH_Drawing_TextBlob *textBlob =
117    OH_Drawing_TextBlobCreateFromString(str, font, OH_Drawing_TextEncoding::TEXT_ENCODING_UTF8);
118// 绘制字块
119OH_Drawing_CanvasDrawTextBlob(canvas, textBlob, 200, 800);
120// 取消填充效果
121OH_Drawing_CanvasDetachBrush(canvas);
122// 销毁各类对象
123OH_Drawing_TextBlobDestroy(textBlob);
124OH_Drawing_FontDestroy(font);
125OH_Drawing_BrushDestroy(brush);
126```
127
128![Screenshot_20241225173900576](figures/Screenshot_20241225173900576.jpg)
129
130<!--RP1-->
131## 相关实例
132
133针对Drawing(C/C++)的开发,有以下相关实例可供参考:
134
135- [NDKGraphicsDraw (API14)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/DocsSample/Drawing/NDKGraphicsDraw)
136<!--RP1End-->