HarmonyOS 鸿蒙Next 自定义字体无法全局使用如何处理

发布于 1周前 作者 nodeper 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 自定义字体无法全局使用如何处理

【问题现象】

registerFont注册全局生效的自定义字体失败,只能注册页面级字体。

1. 预期效果

注册自定义字体后,在应用中能成功使用该字体。

2. 实际效果

注册自定义字体后,显示效果与默认字体相同。

问题代码如下:

  • 注册字体

    // 注册iconFont
    font.registerFont({
      familyName: 'iconFont',
      // 自定义字体存储在rawfile的font文件夹下
      familySrc: $rawfile('font/STXINGKA.TTF')
    })
    
  • 使用字体

    [@Component](/user/Component)
    [@Entry](/user/Entry)
    struct Index {
      build() {
        Column() {
          // 使用自定义字体的文字
          Text("图标字体")
            .fontSize(30)
            .fontFamily("iconfont")
          // 使用默认字体的文字
          Text("图标字体")
            .fontSize(30)
        }.width('100%')
      }
    }
    

【背景知识】

可参考官方文档@ohos.font (注册自定义字体)

【定位思路】

定位自定义字体无法使用的原因,需要从注册字体信息是否正确、使用时生命周期是否有效等方面来检查。常见的定位方式有如下两种:

1. 注册信息填写不正确

请根据接口文档font.registerFont进行检查。

2. 注册生命周期不正确。

当自定义字体注册信息填写正确,但仍然无法使用时,是因为全局使用自定义字体,需在EntryAbility.ets文件的onWindowStageCreate生命周期中,通过windowStage.loadContent回调来注册。

详情参考windowStage.loadContent回调方法。

【解决方案】

根据定位思路可以做出如下操作:

1. 检查注册信息

首先请检查注册信息填写是否有误。

自定义字体被放在了rawfile的font文件夹下,注册路径正确无误,如下图所示:

2. 检查生命周期

根据定位思路,其次检查全局定义的字体生命周期是否正确。

代码示例如下:

//在entryability.ets的onWindowStageCreate中,通过windowStage.loadContent回调注册自定义字体
onWindowStageCreate(windowStage: window.WindowStage): void {
    windowStage.loadContent('pages/Index', (err, data) => {
      windowStage.getMainWindow().then(res => {
        // 注册全局生效的自定义字体
        const uiCtc = res.getUIContext()
        uiCtc.getFont().registerFont({
              familyName: 'iconfont',
              // STXINGKA.TTF保存在rawfile目录下
              familySrc: $rawfile("font/STXINGKA.TTF")
        })
      })
      if (err.code) {
        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
        return;
      }
      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
   });
 }
//在Index.ets中,通过Text组件使用注册后的字体
@Component
@Entry
struct Index {
  build() {
    Column() {
      // 使用自定义字体的文字
      Text("图标字体")
        .fontSize(30)
        .fontFamily("iconfont")
      Blank()
      // 使用默认字体的文字
      Text("图标字体")
        .fontSize(30)
    }.width('100%')
  }
}

处理效果:

如图所示,自定义字体已生效。

其他注意事项:

  • 字体文件需要下载到本地使用,并且unicode编码要获取正确。
  • 编译时需要在真机/模拟器上调试,预览器上不能正常展示。

【总结】

@ohos.font可以注册出页面级的字体,也可以注册出全局性的字体,全局字体需要通过windowStage.loadContent进行回调注册。

1 回复

针对HarmonyOS 鸿蒙Next自定义字体无法全局使用的问题,可尝试以下解决方案:

  1. 确保字体文件正确放置:将自定义字体文件(如.ttf格式)放置在应用的font目录或resfile目录中。
  2. 全局注册字体:在应用的EntryAbility中,通过windowStages.getUIContext().getFont().registerFont方法注册字体,确保在onWindowStageCreatewindowStage.loadContent生命周期中执行注册操作。
  3. 指定字体名称:在需要应用自定义字体的组件中,通过fontFamily属性指定已注册的字体名称。
  4. 检查依赖和版本:确保开发环境和HarmonyOS SDK版本支持全局字体注册功能,并检查是否有相关依赖项未正确安装。

如果上述步骤均正确无误,但自定义字体仍无法全局使用,可能是由于系统或框架层面的限制或bug导致。此时,建议检查HarmonyOS的官方文档和开发者社区,以获取更多信息或解决方案。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部