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