HarmonyOS 鸿蒙Next中html如何引用自定义标题

HarmonyOS 鸿蒙Next中html如何引用自定义标题

<!DOCTYPE html>
<html>
<head>
    <TITLE></TITLE>
    <meta charset="utf-8">
    <style>
        @font-face {
            font-family: 'UbuntuMono';
            src: url('/fonts/UbuntuMono-R.ttf');
        }
        pre{
          color : white;
          font-size : 60px;
          font-family: 'UbuntuMono', monospace;
        }
    </style>
</head>
<body class="body">
<pre>{BILLCONTENT}</pre>
</body>
</html>

这样写一直不生效,请问哪里有问题,路径该如何书写。

目录结构如下

cke_1256.jpeg


更多关于HarmonyOS 鸿蒙Next中html如何引用自定义标题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

7 回复

开发者你好,我这边使用IDE6.0.0.748,API17,样机Pura 70Pro(5.1.0.150)按照您提供的代码设置自定义字体,是生效的。正常web中也是可以按照这个方法完成自定义字体的设置的。

如果您这边不生效,是否方便提供以下信息方便复现分析:

  1. 自定义字体文件(可放置zip包中)

  2. IDE版本号(Help —— About DevEco Studio 查看)

  3. 样机版本号 (设置——关于样机查看,可直接提供对应页截图)

  4. 运行的工程API版本号

更多关于HarmonyOS 鸿蒙Next中html如何引用自定义标题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


介绍:

自定义字体是指开发者根据应用需求创建或选择的字体,通常用于实现特定的文字风格或满足独特的设计要求。当应用需要使用特定的文本样式和字符集时,可以注册并使用自定义字体进行文本渲染。

原理:

自定义字体的注册是指将字体文件(如ttf、otf文件等)从应用资源注册到系统中,使得应用能够使用这些字体进行文本渲染。注册过程是将字体文件通过字体管理接口注册到系统字体库中,以便在应用中进行调用。

Tip:

建议把字体先直接放在rawfile目录下,不要在font试试下,行的通的话再试试放在font下再进行下一步尝试

1、先在全局注册一下字体

import { text } from '@kit.ArkGraphics2D'
// 注册自定义字体
let fontCollection = text.FontCollection.getGlobalInstance()

// 字体文件放在本应用工程的entry/src/main/resources/rawfile目录
fontCollection.loadFontSync('UbuntuMonoR',$rawfile('UbuntuMono-R.ttf'))

换成这个路径试试

url('./UbuntuMono-R.ttf');

【背景知识】

Web:提供具有网页显示能力的Web组件,@ohos.web.webview提供Web控制能力。

【参考方案】

可参考H5页面加载自定义字体库示例,通过Web组件构建HTML页面加载自定义字体库的场景,支持动态加载字体库,点击字体切换按钮可切换字体样式。

  1. 通过getRawFileList加载rawfile目录下的字体文件。
let context = this.getUIContext().getHostContext();
context!.resourceManager.getRawFileList('', (error: BusinessError, value: Array<string>) => {
  if (error != null) {
    return;
  }
  for (let i = 0; i < value.length; i++) {
    if (!value[i].endsWith('.ttf')) {
      continue;
    }
    let fontName = value[i].split('.')[0]
    let fontUrl = './' + value[i]
    this.fontFamilies.push(new FontFamily(fontName, fontUrl));
  }
})
  1. 通过runJavaScript传递JavaScript代码的功能,实现字体的按需动态加载和切换。
// 首先加载字体
if (!fontFamily.isLoaded) {
   let fontLoad = `function loadNewFont() {
                     const font = new FontFace('${fontFamily.fontName}', 'url(${fontFamily.fontUrl})');
                     font.load().then(function() {document.fonts.add(font)});}`
   this.controller.runJavaScript(fontLoad)
   this.controller.runJavaScript('fontLoadCaller()')
   fontFamily.isLoaded = true
}

// 字体文件加载完成后执行字体切换
let changeFont = `function changeFont(){
                    document.getElementById('news-text').style.fontFamily = '${fontFamily.fontName}';
                    document.getElementById('news-title').style.fontFamily = '${fontFamily.fontName}';
                    document.getElementById('news-time').style.fontFamily = '${fontFamily.fontName}';}`
this.controller.runJavaScript(changeFont)
this.controller.runJavaScript('fontChangeCaller()')

背景知识:

楼主我尝试用你的代码来加载字体,确实存在不加载自定义字体的问题。不过我在浏览器上调试了一下,直接在标签内部写入自定义字体是生效的。

问题解决:

代码如下:

<!DOCTYPE html>
<html>
<head>
    <TITLE></TITLE>
    <meta charset="utf-8">
    <style>
        /* 引入字体 */
        @font-face {
            font-family: 'MyCustomFont'; /* 自定义字体的名称 */
            src: url('fonts/test.ttf') format('truetype')
        }
        .pre{
          color : black;
          font-family: 'MyCustomFont';
        }
    </style>
</head>
<body class="body">
<!-- 直接在标签内部使用样式可以生效 -->
<div style="font-family: 'MyCustomFont';">BILLCONTENT The</div>
<div>The</div>
</body>
</html>

字体目录如下:

cke_15723.png

真机演示:

cke_21421.png

  1. 字体管理中注册自定义字体

  2. 设置对应文本的fontFamily。可参考如下代码:

    // xxx.ets 
    import { font } from '@kit.ArkUI'; 
    
    @Entry 
    @Component 
    struct FontExample { 
      @State message: string = 'Hello World'; 
    
      aboutToAppear() { 
        // 注册黑色字体 
        font.registerFont({ 
          familyName: 'Condensed_Black', // 注册的字体名称 
          familySrc: '/font/Sans_Condensed_Black.ttf' // font文件夹与pages目录同级 
        }) 
    
        // 注册黑色斜字体 
        font.registerFont({ 
          familyName: 'Condensed_Black_Italic', // 注册的字体名称 
          familySrc: '/font/Sans_Condensed_Black_Italic.ttf' // font文件夹与pages目录同级 
        }) 
      } 
    
      build() { 
        Column() { 
          Text(this.message) 
            .align(Alignment.Center) 
            .fontSize(50) 
            .fontFamily('Condensed_Black') // 使用黑色字体 
          Text(this.message) 
            .align(Alignment.Center) 
            .fontSize(50) 
            .fontFamily('Condensed_Black_Italic') // 使用黑色斜字体 
          Text(this.message) 
            .align(Alignment.Center) 
            .fontSize(50) 
        } 
        .width('100%') 
        .margin({ top: 30 }) 
      } 
    }
    

    效果图如下:

在HarmonyOS Next中,通过entry/src/main/resources/base/media/layout/目录下的layout.json文件定义页面标题。使用"title"属性设置自定义标题文本,例如:“title”: “我的页面标题”。若需动态修改标题,可在页面代码中使用router.push方法传入title参数,或调用setTitleBar接口实时更新标题栏内容。

在HarmonyOS Next中,HTML文件引用自定义字体时,需要注意资源路径的配置方式。根据你的目录结构,UbuntuMono-R.ttf 字体文件位于 resources/base/media 目录下。

正确的引用方式应该是使用相对路径:

@font-face {
    font-family: 'UbuntuMono';
    src: url('../media/UbuntuMono-R.ttf');
}

或者使用绝对路径:

@font-face {
    font-family: 'UbuntuMono';
    src: url('/resources/base/media/UbuntuMono-R.ttf');
}

关键点:

  1. 确保字体文件已正确放置在 resources/base/media 目录
  2. 路径需要指向实际的资源位置
  3. 字体文件需要支持在HarmonyOS环境中使用

同时检查字体文件是否成功打包到应用中,以及字体格式是否被HarmonyOS支持。

回到顶部