HarmonyOS 鸿蒙Next中可以引入iconfont字体?
HarmonyOS 鸿蒙Next中可以引入iconfont字体?
HarmonyOS可以引入iconfont字体?如何自定义字体?
引入 iconfont 字体的步骤:
- 准备字体文件
从 iconfont 官网 下载项目字体文件(.ttf 格式),并放入项目的资源目录,例如 resources/rawfile 或 fonts/ 目录下。
- 注册字体
在页面加载前注册字体,推荐在 EntryAbility.ets 的 onWindowStageCreate 或组件的 aboutToAppear() 方法中注册:import font from ‘@ohos.font’;
aboutToAppear() { font.registerFont({ familyName: ‘iconfont’, familySrc: $rawfile(‘iconfont.ttf’) // 或使用 ‘/fonts/iconfont.ttf’ }); }
- 使用字体图标
在 Text 组件中使用 Unicode 编码(注意格式为 \uexxx):Text(’\ue6fb’) .fontFamily(‘iconfont’) .fontSize(30) .fontColor(Color.Black)
更多关于HarmonyOS 鸿蒙Next中可以引入iconfont字体?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
【问题定位】
楼主主要问题是想要问:如何加载自定义字体
【解决方案】
1、可以使用this.getUIContext().getFont().registerFont()方法加载自定义字体样式,具体参考以下官方示例中的代码:
// xxx.ets
import { Font } from '@kit.ArkUI';
@Entry
@Component
struct Index {
@State message: string = 'Hello World';
private uiContext: UIContext = this.getUIContext();
private font: Font = this.uiContext.getFont();
aboutToAppear() {
this.font.registerFont({
familyName: 'medium',
familySrc: '/font/medium.ttf' // font文件夹与pages目录同级
})
}
build() {
Column() {
Text(this.message)
.align(Alignment.Center)
.fontSize(20)
.fontFamily('medium') // medium:注册自定义字体的名字($r('app.string.mediumFamilyName')、'mediumRawFile'等已注册字体也能正常使用)
}.width('100%')
}
}
2、另一种方法是直接调用字体引擎的fontCollection.loadFontSync接口来注册自定义字体到字体引擎。示例代码如下:
import { text } from '@kit.ArkGraphics2D'
let fontCollection: text.FontCollection = new text.FontCollection();
@Entry
@Component
struct RenderTest {
LoadFontSyncTest() {
fontCollection.loadFontSync('Clock_01', 'file:///system/fonts/HarmonyClock_01.ttf')
let fontFamilies: Array<string> = ["Clock_01"]
let myTextStyle: text.TextStyle = {
fontFamilies: fontFamilies
};
let myParagraphStyle: text.ParagraphStyle = {
textStyle: myTextStyle,
}
let paragraphBuilder: text.ParagraphBuilder = new text.ParagraphBuilder(myParagraphStyle, fontCollection);
let textData = "测试 loadFontSync 加载字体HarmonyClock_01.ttf";
paragraphBuilder.addText(textData);
let paragraph: text.Paragraph = paragraphBuilder.build();
paragraph.layoutSync(600);
}
aboutToAppear() {
this.LoadFontSyncTest();
}
build() {
}
}
3、可通过Canvas画布实现自定义字体及样式的自定义,可参考以下示例代码:
// xxx.ets
import { text } from '@kit.ArkGraphics2D';
@Entry
@Component
struct FontDemo {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings);
build() {
Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
Canvas(this.context)
.width('100%')
.height('100%')
.backgroundColor('rgb(213,213,213)')
.onReady(() => {
// 常规字体样式,常规粗细,字体大小为30px,字体系列为sans-serif
this.context.font = 'normal normal 30px sans-serif'
this.context.fillText("Hello px", 20, 60)
// 斜体样式,加粗,字体大小为30vp,字体系列为monospace
this.context.font = 'italic bold 30vp monospace'
this.context.fillText("Hello vp", 20, 100)
// 加载rawfile目录下的自定义字体文件HarmonyOS_Sans_Thin_Italic.ttf
let fontCollection = text.FontCollection.getGlobalInstance();
fontCollection.loadFontSync('HarmonyOS_Sans_Thin_Italic', $rawfile("HarmonyOS_Sans_Thin_Italic.ttf"))
// 加粗,字体大小为30vp,字体系列为HarmonyOS_Sans_Thin_Italic
this.context.font = "bold 30vp HarmonyOS_Sans_Thin_Italic"
this.context.fillText("Hello customFont", 20, 140)
})
}
.width('100%')
.height('100%')
}
}
以上就是本人提供的三种解决方案,如有疑问欢迎继续提出,大家有更多方案也欢迎讨论!
可以参考:如何使用iconfont-方舟UI框架(ArkUI)-UI框架-应用框架开发-开发 - 华为HarmonyOS开发者
import { Font } from '@kit.ArkUI'
@Entry
@Component
struct UseIconFont {
// Assuming 0000 is the Unicode for the specified icon, developers actually need to obtain Unicode from the ttf file of the registered iconFont
@State unicode: string = '\u0000';
aboutToAppear(): void {
let font: Font = this.getUIContext().getFont();
font.registerFont({
familyName: 'iconfont',
familySrc: 'xxx.ttf'
})
}
build() {
Row() {
Column() {
Text(this.unicode)
.fontSize(50)
.fontWeight(FontWeight.Bold)
.fontFamily('iconfont')
}
.width('100%')
}
.height('100%')
}
}
在HarmonyOS Next中,可以通过资源管理方式引入自定义字体文件。将iconfont字体文件(如.ttf格式)放置在工程的resources/base/media目录下,然后在代码中使用Font接口加载并应用。具体可通过ResourceManager获取字体资源路径,再使用Canvas或Text组件进行渲染显示。
在HarmonyOS Next中,可以通过以下方式引入iconfont字体:
-
字体文件准备:下载iconfont字体文件(如.ttf/.otf格式),放入工程的
resources/base/media/目录。 -
全局声明:在
resources/base/element/string.json中定义字体资源:
{
"string": [
{
"name": "iconfont",
"value": "/base/media/iconfont.ttf"
}
]
}
- 组件调用:在ArkUI组件中通过
font属性引用:
Text('\ue001') // Unicode字符
.font({ size: 24, family: 'iconfont' })
自定义字体步骤:
- 将字体文件放入
resources/base/media/ - 在
string.json中声明字体资源 - 通过
.font({ family: 'YourFontName' })调用
注意:
- 字体文件需为HarmonyOS支持的格式
- 图标字符需通过Unicode值引用
- 建议使用官方推荐的图标管理方案确保兼容性

