HarmonyOS 鸿蒙Next中可以引入iconfont字体?

HarmonyOS 鸿蒙Next中可以引入iconfont字体?

HarmonyOS可以引入iconfont字体?如何自定义字体?

5 回复

引入 iconfont 字体的步骤:

  1. 准备字体文件

iconfont 官网 下载项目字体文件(.ttf 格式),并放入项目的资源目录,例如 resources/rawfile 或 fonts/ 目录下。

  1. 注册字体

在页面加载前注册字体,推荐在 EntryAbility.ets 的 onWindowStageCreate 或组件的 aboutToAppear() 方法中注册:import font from ‘@ohos.font’;

aboutToAppear() { font.registerFont({ familyName: ‘iconfont’, familySrc: $rawfile(‘iconfont.ttf’) // 或使用 ‘/fonts/iconfont.ttf’ }); }

  1. 使用字体图标

在 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%')
  }
}

自定义字体可以参考:自定义字体-修改阅读设置-书籍内容排版-Reader Kit(阅读服务)-应用服务

在HarmonyOS Next中,可以通过资源管理方式引入自定义字体文件。将iconfont字体文件(如.ttf格式)放置在工程的resources/base/media目录下,然后在代码中使用Font接口加载并应用。具体可通过ResourceManager获取字体资源路径,再使用Canvas或Text组件进行渲染显示。

在HarmonyOS Next中,可以通过以下方式引入iconfont字体:

  1. 字体文件准备:下载iconfont字体文件(如.ttf/.otf格式),放入工程的resources/base/media/目录。

  2. 全局声明:在resources/base/element/string.json中定义字体资源:

{
  "string": [
    {
      "name": "iconfont",
      "value": "/base/media/iconfont.ttf"
    }
  ]
}
  1. 组件调用:在ArkUI组件中通过font属性引用:
Text('\ue001') // Unicode字符
  .font({ size: 24, family: 'iconfont' })

自定义字体步骤

  1. 将字体文件放入resources/base/media/
  2. string.json中声明字体资源
  3. 通过.font({ family: 'YourFontName' })调用

注意:

  • 字体文件需为HarmonyOS支持的格式
  • 图标字符需通过Unicode值引用
  • 建议使用官方推荐的图标管理方案确保兼容性
回到顶部