注册使用主题字体的常用接口如下表所示,详细接口说明请见@ohos.graphics.text (文本模块)。
| 接口 | 描述 |
|---|---|
| getGlobalInstance(): FontCollection | 获取应用全局字体集的实例。 |
请确保在设备系统主题应用中,能成功应用一项主题字体。
导入依赖的相关模块。
import { text } from '@kit.ArkGraphics2D'; 使用getGlobalInstance()接口获取全局字体集对象,系统框架在注册主题字体过程中仅会将主题字体信息传入全局字体集对象中。
// 获取字体管理器全局FontCollection实例 let fontCollection = text.FontCollection.getGlobalInstance();
创建段落样式,并使用字体集实例构造段落生成器ParagraphBuilder实例,用于生成段落。
在生成段落对象设置段落样式入参时,不能指定fontFamilies属性,否则系统会优先使用指定字体而非主题字体。
若未在系统主题应用中设置一项主题字体,则将使用系统默认字体进行绘制。
// 设置文本样式
let myTextStyle: text.TextStyle = {
color: { alpha: 255, red: 255, green: 0, blue: 0 },
fontSize: 33
};
// 创建一个段落样式对象,以设置排版风格
let myParagraphStyle: text.ParagraphStyle = {
textStyle: myTextStyle,
align: 3,
wordBreak: text.WordBreak.NORMAL
};
// 创建一个段落生成器
let paragraphBuilder = new text.ParagraphBuilder(myParagraphStyle, fontCollection); 设置文本样式,添加文本内容,并生成段落文本用于后续文本的绘制显示。
// 在段落生成器中设置文本样式
paragraphBuilder.pushStyle(myTextStyle);
// 在段落生成器中设置文本内容
paragraphBuilder.addText("Hello World. \nThis is the theme font.");
// 通过段落生成器生成段落
let paragraph = paragraphBuilder.build(); 创建渲染节点,并保存到数组。(此处示例代码为简化逻辑,采用数组作为容器,实际开发中应结合应用情况选择更恰当的容器来保证节点的添加与删除对应。)
// 创建渲染节点数组
const renderNodeMap: Array<RenderNode> = new Array();
// 创建节点控制器
class MyNodeController extends NodeController {
private rootNode: FrameNode | null = null;
makeNode(uiContext: UIContext): FrameNode {
this.rootNode = new FrameNode(uiContext);
if (this.rootNode == null) {
return this.rootNode;
}
const renderNode = this.rootNode.getRenderNode();
if (renderNode != null) {
renderNode.frame = { x: 0, y: 0, width: 300, height: 50 };
renderNode.pivot = { x: 0, y: 0 };
}
return this.rootNode;
}
addNode(node: RenderNode): void {
if (this.rootNode == null) {
return;
}
const renderNode = this.rootNode.getRenderNode();
if (renderNode != null) {
renderNode.appendChild(node);
// 将节点添加到渲染节点数组中
renderNodeMap.push(node);
}
}
clearNodes(): void {
if (this.rootNode == null) {
return;
}
const renderNode = this.rootNode.getRenderNode();
if (renderNode != null) {
renderNode.clearChildren();
// 将节点从渲染节点数组中移除
renderNodeMap.pop();
}
}
} 创建渲染节点更新函数,并导出函数,供其他文件(如:EntryAbility.ets)使用;重绘制节点目的为更新排版中字体信息,若不更新字体信息,使用之前残留结果,可能造成文字乱码。
// 导出渲染节点更新函数
export function updateRenderNodeData() {
renderNodeMap.forEach((node) => {
// 主动触发节点重绘制
node.invalidate();
});
} 在EntryAbility.ets中接收主题字变更事件,并调用渲染节点更新函数。
import { AbilityConstant, Configuration, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import { updateRenderNodeData } from '../pages/Index';
// ...
export default class EntryAbility extends UIAbility {
preFontId = "";
// ...
onConfigurationUpdate(newConfig: Configuration): void {
let fontId = newConfig.fontId;
if (fontId && fontId !== this.preFontId) {
this.preFontId = fontId;
updateRenderNodeData();
// ...
}
}
}