1# 文本测量(C/C++) 2<!--Kit: ArkGraphics 2D--> 3<!--Subsystem: Graphics--> 4<!--Owner: @oh_wangxk; @gmiao522; @Lem0nC--> 5<!--Designer: @liumingxiang--> 6<!--Tester: @yhl0101--> 7<!--Adviser: @ge-yafang--> 8## 场景介绍 9 10文本测量指的是在图形绘制中,对文本的尺寸和布局进行评估,计算文本在给定字体和样式下占用的空间(例如宽度、高度和其他相关信息)的过程。文本测量用于文本排版、布局、渲染以及调整文本显示的位置和大小等场景,便于对界面的布局和呈现更好地把控和调整,以达到设计预期。 11 12当前主要支持以下方面的文本测量能力: 13 14- **文本宽度**:测量给定文本在特定字体、大小和样式下的水平长度。 15 16- **文本高度**:测量给定文本的垂直高度,通常涉及字体的上升线、下降线等。 17 18- **行间距**:测量多行文本之间的垂直距离,通常与字体的行距相关。 19 20- **字符间距**:测量单个字符之间的水平距离,通常与字形和字体设计有关。 21 22 23## 接口说明 24 25文本测量中常用接口如下表所示,详细接口说明参考[drawing_text_typography.h](../reference/apis-arkgraphics2d/capi-drawing-text-typography-h.md)。 26 27| 接口名 | 描述 | 28| -------- | -------- | 29| double OH_Drawing_TypographyGetLongestLine(OH_Drawing_Typography\*) | 获取最长行的宽度,建议实际使用时将返回值向上取整。 | 30| double OH_Drawing_TypographyGetLongestLineWithIndent(OH_Drawing_Typography\*) | 获取最长行的宽度(该宽度包含当前行缩进的宽度),建议实际使用时将返回值向上取整。 | 31| size_t OH_Drawing_TypographyGetLineCount (OH_Drawing_Typography\* ) | 获取文本行数。 | 32| OH_Drawing_LineMetrics\* OH_Drawing_TypographyGetLineMetrics (OH_Drawing_Typography\* ) | 获取段落行的度量信息。包含行的高度、宽度、起始坐标等信息。 | 33| double OH_Drawing_TextStyleGetLetterSpacing (OH_Drawing_TextStyle \*) | 获取文本的字符间距。 | 34 35 36## 开发步骤 37 381. 在工程的`src/main/cpp/CMakeLists.txt`文件中添加以下lib。 39 ```c++ 40 libnative_drawing.so 41 ``` 42 432. 导入依赖的相关头文件。 44 45 ```c++ 46 #include <native_drawing/drawing_font_collection.h> 47 #include <native_drawing/drawing_text_declaration.h> 48 #include <native_drawing/drawing_text_typography.h> 49 ``` 50 513. 创建段落生成器ParagraphBuilder,并设置段落样式。 52 53 ```c++ 54 // 创建段落样式 55 OH_Drawing_TypographyStyle *typoStyle = OH_Drawing_CreateTypographyStyle(); 56 // 创建段落生成器 57 OH_Drawing_TypographyCreate *handler = OH_Drawing_CreateTypographyHandler(typoStyle, OH_Drawing_CreateFontCollection()); 58 // 创建文本样式,并设置字体大小为50 59 OH_Drawing_TextStyle *txtStyle = OH_Drawing_CreateTextStyle(); 60 OH_Drawing_SetTextStyleFontSize(txtStyle, 50); 61 OH_Drawing_TypographyHandlerPushTextStyle(handler, txtStyle); 62 // 向构造器中添加文本 63 const char *text = "排版测量的文字度量信息"; 64 OH_Drawing_TypographyHandlerAddText(handler, text); 65 // 通过生成器构造段落 66 OH_Drawing_Typography *typography = OH_Drawing_CreateTypography(handler); 67 ``` 68 694. 调用排版接口并设置段落排版宽度,对段落进行塑型排版。 70 71 ```c++ 72 // 对段落进行塑形排版,设置排版宽度1000 73 OH_Drawing_TypographyLayout(typography, 1000); 74 ``` 75 765. 调用段落测量信息获取接口,获取指定数据。 77 78 ```c++ 79 // case1: 获取排版后最长行行宽 80 double longestLine = OH_Drawing_TypographyGetLongestLine(typography); 81 82 // case2:获取排版后段落行数 83 size_t lineCnt = OH_Drawing_TypographyGetLineCount(typography); 84 85 // case3:获取段落每行的度量信息 86 OH_Drawing_LineMetrics* lineMetrics = OH_Drawing_TypographyGetLineMetrics(typography); 87 int lineMetricsSize = OH_Drawing_LineMetricsGetSize(lineMetrics); 88 for (int i = 0; i < lineMetricsSize; ++i) { 89 // lineMetrics为经过排版测量的文字度量信息 90 double curLineAscender = lineMetrics[i].ascender; 91 double curLineWidth = lineMetrics[i].width; 92 } 93 94 // case4:获取段落带缩进最长行行宽 95 double longestLineWithIndent = OH_Drawing_TypographyGetLongestLineWithIndent(typography); 96 ``` 97 98