• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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系统字体是指操作系统预设的字体,用于在没有指定自定义字体时显示文本,确保文本的可读性和一致性。默认的系统字体为“HarmonyOS Sans”。
12
13**使用系统字体**的情况通常是在应用未注册自定义字体,或在没有显式指定文本样式时,系统会使用默认的系统字体。另外,系统字体有多种,开发者可以先获取系统字体的配置信息,并根据信息中的字体家族名来进行系统字体的切换和使用。
14
15**禁用系统字体**的情况通常发生在开发者希望确保应用中仅使用自定义字体,而不受操作系统默认字体影响的场景。当自定义字体不存在时,不禁用系统字体,系统则会自动回退到默认字体。通过禁用系统字体,开发者可以在任何场景避免字体回退为系统默认字体,确保文本渲染符合设计预期,从而统一应用的视觉风格。
16
17
18## 接口说明
19
20以下是系统字体相关的常用接口和结构体,详细接口说明请参考[Drawing](../reference/apis-arkgraphics2d/capi-drawing.md)。
21
22| 接口名 | 描述 |
23| -------- | -------- |
24| OH_Drawing_FontConfigInfo\* OH_Drawing_GetSystemFontConfigInfo(OH_Drawing_FontConfigInfoErrorCode\*) | 获取系统字体配置信息,返回系统字体配置信息结构体OH_Drawing_FontConfigInfo。 |
25| void OH_Drawing_DestroySystemFontConfigInfo(OH_Drawing_FontConfigInfo\*) | 释放系统字体配置信息占用的内存。 |
26| OH_Drawing_FontCollection\* OH_Drawing_CreateSharedFontCollection(void) | 创建可共享的字体集对象OH_Drawing_FontCollection。 |
27| OH_Drawing_TextStyle\* OH_Drawing_CreateTextStyle(void) | 创建指向OH_Drawing_TextStyle对象的指针,用于设置文本样式。 |
28| OH_Drawing_SetTextStyleFontFamilies (OH_Drawing_TextStyle \*, int, const char \*fontFamilies[]) | 设置指定文本样式的字体家族类型。 |
29| void OH_Drawing_DisableFontCollectionSystemFont(OH_Drawing_FontCollection\* fontCollection) | 禁用系统字体。 |
30
31| 结构体名 | 描述 |
32| -------- | -------- |
33| OH_Drawing_FontConfigInfo | 系统字体配置信息结构体。 |
34| OH_Drawing_FontGenericInfo | 系统所支持的通用字体集信息结构体。 |
35| OH_Drawing_FontFallbackGroup | 备用字体集信息结构体。 |
36
37
38## 获取系统字体信息
39
401. 在工程的`src/main/cpp/CMakeLists.txt`文件中添加以下lib。
41   ```c++
42   libnative_drawing.so
43   ```
44
452. 导入依赖的相关头文件。
46
47   ```c++
48   #include <native_drawing/drawing_font_collection.h>
49   #include <native_drawing/drawing_text_typography.h>
50   #include <native_drawing/drawing_register_font.h>
51   #include <hilog/log.h>
52   ```
53
543. 获取系统字体的配置信息,可以通过返回的状态码确定获取信息是否成功,状态码的包含的具体情况和对应含义可见[OH_Drawing_FontConfigInfoErrorCode](../reference/apis-arkgraphics2d/capi-drawing-text-typography-h.md#oh_drawing_fontconfiginfoerrorcode)。
55
56   ```c++
57   OH_Drawing_FontConfigInfoErrorCode fontConfigInfoErrorCode;  // 用于接收错误代码
58   OH_Drawing_FontConfigInfo* fontConfigInfo = OH_Drawing_GetSystemFontConfigInfo(&fontConfigInfoErrorCode);
59   if(fontConfigInfoErrorCode != SUCCESS_FONT_CONFIG_INFO) {
60       OH_LOG_Print(LOG_APP, LOG_ERROR, LOG_DOMAIN, "DrawingSample", "获取系统信息失败,错误代码为: %{public}d", fontConfigInfoErrorCode);
61   }
62   ```
63
644. 系统字体的配置信息[OH_Drawing_FontConfigInfo](../reference/apis-arkgraphics2d/capi-drawing-oh-drawing-fontconfiginfo.md)包含以下几类信息:
65
66   - 系统字体文件路径数量。
67
68   - 通用字体集列表数量。
69
70   - 备用字体集列表数量。
71
72   - 系统字体文件路径列表。
73
74   - 通用字体集列表,具体信息可见[OH_Drawing_FontGenericInfo](../reference/apis-arkgraphics2d/capi-drawing-oh-drawing-fontgenericinfo.md)结构体。
75
76   - 备用字体集列表,具体信息可见[OH_Drawing_FontFallbackGroup](../reference/apis-arkgraphics2d/capi-drawing-oh-drawing-fontfallbackgroup.md)结构体。
77
78   以下示例展示系统字体的一些具体配置信息的获取:
79
80   ```c++
81   // 获取系统字体配置信息示例
82   if (fontConfigInfo != nullptr) {
83       // 获取字体文件路径数量,打印日志
84       size_t fontDirCount = fontConfigInfo->fontDirSize;
85       OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "DrawingSample", "字体文件路径数量为: %{public}zu\n", fontDirCount);
86       // 遍历字体文件路径列表,打印日志
87       for (size_t i = 0; i < fontDirCount; ++i) {
88           OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "DrawingSample", "字体文件路径为: %{public}s\n", fontConfigInfo->fontDirSet[i]);
89       }
90       // 获取通用字体集数量,打印日志
91       size_t genericCount = fontConfigInfo->fontGenericInfoSize;
92       OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "DrawingSample", "通用字体集数量为: %{public}zu\n", genericCount);
93       // 遍历获取每个通用字体集中的字体家族名(例如 HarmonyOS Sans),打印日志
94       for(size_t i = 0; i < genericCount; ++i) {
95           OH_Drawing_FontGenericInfo& genericInfo = fontConfigInfo->fontGenericInfoSet[i];
96           OH_LOG_Print(LOG_APP, LOG_INFO, LOG_DOMAIN, "DrawingSample", "获取第%{public}zu个通用字体集中的字体家族名为: %{public}s", i, genericInfo.familyName);
97       }
98   }
99   ```
100
101   以下打印的示例为应用设备系统对应的部分系统字体配置信息情况,不同设备系统配置信息可能不同,此处仅示意。
102
103   ![zh-cn_image_0000002211603636](figures/zh-cn_image_0000002211603636.png)
104
1055. 如若后续不再需要系统字体的系统配置信息时,则释放其占用的内存。
106
107   ```c++
108   OH_Drawing_DestroySystemFontConfigInfo(fontConfigInfo);
109   ```
110
111
112## 使用或切换系统字体
113
114系统字体可以有多种,可以先获取系统字体配置信息,再根据其中的字体家族名来进行系统字体的切换和使用。
115
116如果不指定使用任何字体时,会使用系统默认字体“HarmonyOS Sans”显示文本。
117
1181. 在工程的`src/main/cpp/CMakeLists.txt`文件中添加以下lib。
119   ```c++
120   libnative_drawing.so
121   ```
122
1232. 导入依赖的相关头文件。
124
125   ```c++
126   #include <native_drawing/drawing_font_collection.h>
127   #include <native_drawing/drawing_text_typography.h>
128   #include <native_drawing/drawing_register_font.h>
129   #include <hilog/log.h>
130   ```
131
1323. 创建字体管理器,建议优先使用OH_Drawing_CreateSharedFontCollection创建可共享的字体集对象。
133
134   > **说明:**
135   >
136   > 使用OH_Drawing_CreateFontCollection和OH_Drawing_CreateSharedFontCollection均可创建字体管理器OH_Drawing_FontCollection对象,但前者创建的字体集指针对象只能被一个段落生成器OH_Drawing_TypographyCreate对象使用,无法被多个段落生成器OH_Drawing_TypographyCreate对象共享使用。如需在多个段落生成器OH_Drawing_TypographyCreate对象间共享使用,请使用后者创建可共享的字体集对象。
137
138   ```c++
139   OH_Drawing_FontCollection *fontCollection = OH_Drawing_CreateSharedFontCollection();
140   ```
141
1424. 创建一个文本样式对象,即OH_Drawing_TextStyle对象,用于设置文本样式。
143
144   ```c++
145   OH_Drawing_TextStyle* textStyle = OH_Drawing_CreateTextStyle();
146   ```
147
1485. [获取系统字体信息](#获取系统字体信息),获取系统字体的字体家族名,并在文本样式中设置为该系统字体。
149
150   ```c++
151   // 情况一:设置系统字体为"HarmonyOS Sans Condensed"
152   const char* myFontFamilies[] = {"HarmonyOS Sans Condensed"};
153   OH_Drawing_SetTextStyleFontFamilies(textStyle, 1, myFontFamilies);
154
155   // 情况二:不手动设置,此时使用的是系统默认字体"HarmonyOS Sans"
156   // const char* myFontFamilies[] = {"HarmonyOS Sans Condensed"};
157   // OH_Drawing_SetTextStyleFontFamilies(textStyle, 1, myFontFamilies);
158   ```
159
1606. 生成最终段落文本,以便实现最终的文本绘制和显示。
161
162   ```c++
163   // 设置其他文本样式
164   OH_Drawing_SetTextStyleColor(textStyle , OH_Drawing_ColorSetArgb(0xFF, 0x00, 0x00, 0x00));
165   OH_Drawing_SetTextStyleFontSize(textStyle , 70.0);
166   // 创建一个段落样式对象,以设置排版风格
167   OH_Drawing_TypographyStyle *typographyStyle = OH_Drawing_CreateTypographyStyle();
168   OH_Drawing_SetTypographyTextAlign(typographyStyle, TEXT_ALIGN_LEFT); // 设置段落样式为左对齐
169   // 创建一个段落生成器
170   OH_Drawing_TypographyCreate* handler = OH_Drawing_CreateTypographyHandler(typographyStyle, fontCollection);
171   // 在段落生成器中设置文本样式
172   OH_Drawing_TypographyHandlerPushTextStyle(handler, textStyle);
173   // 在段落生成器中设置文本内容
174   const char* text = "Hello World. 你好世界。\n以上文字使用了系统字体";
175   OH_Drawing_TypographyHandlerAddText(handler, text);
176   // 通过段落生成器生成段落
177   OH_Drawing_Typography* typography = OH_Drawing_CreateTypography(handler);
178   ```
179
180
181## 禁用系统字体
182
183当自定义字体不存在时,不禁用系统字体,系统则会自动回退到默认字体。通过禁用系统字体,开发者可以在任何场景避免字体回退为系统默认字体,确保文本渲染符合设计预期,从而统一应用的视觉风格。
184
185在一些应用场景中,开发者可能希望只使用自定义字体来确保字体一致性或提供更具个性化的用户体验。此时,开发者可以通过禁用系统字体,确保应用只使用注册的自定义字体,而不依赖于系统字体。
186
187> **说明:**
188>
189> 禁用系统字体后,请确保注册使用自定义字体,否则文本将无法正常显示。
190
1911. 确保已成功注册自定义字体,用于保证禁用系统字体后文本的正常显示,具体可见[自定义字体的注册和使用](custom-font-c.md)。
192
1932. 在工程的`src/main/cpp/CMakeLists.txt`文件中添加以下lib。
194   ```c++
195   libnative_drawing.so
196   ```
197
1983. 导入依赖的相关头文件。
199
200   ```c++
201   #include <native_drawing/drawing_font_collection.h>
202   #include <native_drawing/drawing_text_typography.h>
203   #include <native_drawing/drawing_register_font.h>
204   #include <hilog/log.h>
205   ```
206
2074. 创建字体管理器,建议优先使用OH_Drawing_CreateSharedFontCollection创建可共享的字体集对象。
208
209   ```c++
210   OH_Drawing_FontCollection *fontCollection = OH_Drawing_CreateSharedFontCollection();
211   ```
212
2135. 禁用系统字体。
214
215   ```c++
216   OH_Drawing_DisableFontCollectionSystemFont(fontCollection);
217   ```
218
2196. 创建文本样式对象,使用注册成功的自定义字体。
220
221   > **注意:**
222   >
223   > 若不设置字体,文本会默认使用系统字体,而系统字体禁用后若不设置使用自定义字体,文本将无法正常显示。
224
225   ```c++
226   OH_Drawing_TextStyle* textStyle = OH_Drawing_CreateTextStyle();
227   // 禁用系统字体后的几种情况如下:
228   // 情况一:如果此时设置使用了自定义字体,文本会正常显示
229   const char* myFontFamilies[] = {"myFamilyName"}; //确保已成功注册自定义字体,填入自定义字体的字体家族名
230   OH_Drawing_SetTextStyleFontFamilies(textStyle, 1, myFontFamilies);
231
232   // 情况二:如果此时使用了系统字体,文本将无法显示
233   const char* myFontFamilies[] = {"HarmonyOS_Sans"};
234   OH_Drawing_SetTextStyleFontFamilies(textStyle, 1, myFontFamilies);
235
236   // 情况三:如果此时不设置使用字体,文本会默认使用系统默认字体,而此时系统字体已被禁用,因此文本将无法显示
237   const char* myFontFamilies[] = {"HarmonyOS_Sans"};
238   // OH_Drawing_SetTextStyleFontFamilies(textStyle, 1, myFontFamilies);
239   ```
240
2417. 生成最终的段落文本,以便实现最终的文本绘制和显示。
242
243   ```c++
244   // 设置其他文本样式
245   OH_Drawing_SetTextStyleColor(textStyle , OH_Drawing_ColorSetArgb(0xFF, 0x00, 0x00, 0x00));
246   OH_Drawing_SetTextStyleFontSize(textStyle , 70.0);
247   // 创建一个段落样式对象,以设置排版风格
248   OH_Drawing_TypographyStyle *typographyStyle = OH_Drawing_CreateTypographyStyle();
249   OH_Drawing_SetTypographyTextAlign(typographyStyle, TEXT_ALIGN_LEFT); // 设置段落样式为左对齐
250   // 创建一个段落生成器
251   OH_Drawing_TypographyCreate* handler = OH_Drawing_CreateTypographyHandler(typographyStyle, fontCollection);
252   // 在段落生成器中设置文本样式
253   OH_Drawing_TypographyHandlerPushTextStyle(handler, textStyle);
254   // 在段落生成器中设置文本内容
255   const char* text = "Hello World. 你好世界。\n以上文字使用了主题字体";
256   OH_Drawing_TypographyHandlerAddText(handler, text);
257   // 通过段落生成器生成段落
258   OH_Drawing_Typography* typography = OH_Drawing_CreateTypography(handler);
259   ```
260