HarmonyOS 鸿蒙Next中应用加载自定义Symbol失败了……请帮帮我

HarmonyOS 鸿蒙Next中应用加载自定义Symbol失败了……请帮帮我 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ui-design-custom-symbol-res-register#约束条件

我是根据这个文档进行实践的,但是我没看懂。

src/main/ets/component/VividSymbols.ets

import { symbolRegister } from '@kit.UIDesignKit';
import { BusinessError } from '@kit.BasicServicesKit';

@Preview
@Entry
@Component
struct VividSymbols {
  @State fontWeightValue: number = 400; // 可变字体粗细值

  aboutToAppear(): void {
    let uiContext: UIContext = this.getUIContext();
    uiContext.getFont().registerFont({
      familyName: 'VividSymbol',
      familySrc: $rawfile('symbol/VividSymbols-VF.ttf')
    });

    try {
      console.info("Starting symbol registration...")
      // 注册自定义的Symbol资源,在resource/rawfile目录下配置图标资源
      let result =
        symbolRegister.registerSymbol(
          $rawfile("symbol/VividSymbols-VF.ttf"),
          $rawfile("symbol/VividSymbols-VF.json")
        );
      console.info("Registration result: " + JSON.stringify(result))
    } catch (error) {
      let err = error as BusinessError;
      console.error("errCode:" + err.code)
      console.error("error " + err.message);
    }
  }

  build() {
    Column({ space: 20 }) {
      Text("Vivid Symbols")
        .fontSize(24)
        .fontWeight(FontWeight.Bold)

      Text(`fontWeight: ${this.fontWeightValue}`)
        .fontSize(16)

      Slider({
        value: this.fontWeightValue,
        min: 100,
        max: 900,
        step: 100
      })
        .blockColor('#007DFF')
        .trackColor('#CCCCCC')
        .selectedColor('#007DFF')
        .width('80%')
        .onChange((value: number) => {
          this.fontWeightValue = value;
        })

      // 这个不展示,但是占用屏幕面积
      SymbolGlyph($r('app.string.symbol_custom_my'))
        .fontSize(80)
        .fontWeight(this.fontWeightValue)
        .fontColor([Color.Red])

      // 可以展示,但是 fontWeight 貌似只有两种:400 和 700
      // 我生成字体时,原始的 SVG 图标时是 100 400 900 的
      Text('\uE100')
        .fontFamily('VividSymbol')
        .fontSize(80)
        .fontWeight(this.fontWeightValue)

      Text("系统 Symbol 对比:")
        .fontSize(16)
        .margin({ top: 20 })

      SymbolGlyph($r('sys.symbol.person'))
        .fontSize(48)
        .fontWeight(this.fontWeightValue)
        .fontColor([Color.Blue])
    }
    .width('100%')
    .padding(20)
  }
}

我生成的字体的网盘链接

https://pan.baidu.com/s/1QysgHdwVES8yV60X7QD3NA?pwd=n91g

因为这里的附件上传好像有问题,传不上去文件。

请帮我看看,为啥

SymbolGlyph($r('app.string.symbol_custom_my'))

这样不展示符号。

这个字体放网页上,可以丝滑连续的做粗细变化,在上面代码里,要么不展示,能展示的,好像也只能有两种粗细变化,目测的。

我的期待是使用 SymbolGlyph 这个做 自定义 Symbol 的展示,希望支持不同粗细的调节。

字体在网页上的展示:

回复帮助我的人:

在讨论区上传图片会遇到这个问题,所以我在这里回复。

测试设备:

我没有真机,我是使用这个模拟器运行的。

我做过的尝试:


更多关于HarmonyOS 鸿蒙Next中应用加载自定义Symbol失败了……请帮帮我的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

我记得之前在某个文档里看到Unicode要配置到0x100000以上,但是iconfont在制作编辑的时候Unicode又不能超过5位,华为工程师有说SymbolGlyph现在还不支持自定义Symbol了么。

参看下这个文档《图标小符号 (SymbolGlyph/SymbolSpan)》

cke_3683.png

更多关于HarmonyOS 鸿蒙Next中应用加载自定义Symbol失败了……请帮帮我的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Unicode要配置到0x100000以上 这个是我真正遇到的问题,华为 客户支持工程师 的帮助 我解决了,我也录制了视频解释了 Symbol 制作的过程,有兴趣可以看看 bilibili.com/video/BV18eo7BGEzf。

在HarmonyOS开发中加载自定义Symbol失败,可按以下步骤排查解决:

  1. 检查文件约束:确认SVG文件格式符合官方要求,视图大小、命名空间没有错误,文件路径和名称没有拼写错误。
  2. 核对资源配置:检查资源注册路径、配置项是否正确,确保资源已经正确纳入项目编译。
  3. 检查环境配置:确认工程compileSdkVersion满足自定义Symbol开发要求,API版本不低于要求版本,若版本过低升级即可。

经过华为 客户支持工程师 的帮助,我大概弄懂了,就是我的字符的编号太小了,需要一个大一点数字,比如在 \U00100000 这个 16 进制 数字之后的。我猜测,是使用 “补充私人使用区B” 这个区间。

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:https://www.bilibili.com/video/BV1S4411E7LY/?p=17,

SymbolGlyph($r('app.string.symbol_custom_my'))

楼主是不是设备有问题?我用楼主的代码在API 22的设备上运行可以正常显示一个占位的图标的 

呐真是羡慕你呀……我已经和 华为 客户支持工程师 视频会议沟通了,他已经重现出来了我的问题,他们会后续跟进这个问题。

没看到你前面的代码,你的VividSymbols-VF.json和string.json是配置对的吗 ?

{
  "string": [
    {
      "name": "symbol_custom_phone_fill_1",
      "value": "0x100016"
    }
  ]
}
{
  "version": "1.0.0",
  "axes": [
    {
      "name": "wght",
      "min": 100,
      "max": 900,
      "default": 400
    }
  ],
  "icons": {
    "symbol_custom_my": {
      "unicode": "\uE100"
    }
  }
}

我已经和 华为 客户支持工程师 视频会议沟通了,他已经重现出来了我的问题,他们会后续跟进这个问题。感谢你的回复哈。

在HarmonyOS Next中,自定义Symbol加载失败常见原因:

  1. Symbol资源未正确打包到.har或.hsp中,需检查oh-package.json5的resource配置
  2. Symbol文件名或ID与代码引用的@ohos/resources路径不一致
  3. 使用了不被支持的SVG属性(如渐变、滤镜),建议转换为系统支持的矢量格式

请确认资源文件放置在resources/base/media目录下,并重新编译。

你的自定义Symbol不显示且粗细无级变的问题,原因和方案如下:

1. 核心原因:

  • SymbolGlyph不支持自定义可变字体的连续fontWeight属性SymbolGlyphfontWeight参数是为系统Symbol的分层渲染设计的(仅通过FontWeight枚举切换预设层级),无法应用到自定义字体的可变轴。
  • Text组件已能实现你的需求。你在Text组件中使用\uE100配合fontFamily就能看到图标,这证明了字体文件和注册本身没有问题。TextfontWeight可传递数值,从而驱动可变字体的wght轴实现连续粗细变化。

2. 解决方案:直接使用Text组件 放弃SymbolGlyph,用Text完全实现你“丝滑粗细变化”的期待,逻辑无需改变:

// 直接用Text即可。fontWeight(this.fontWeightValue) 能让可变字体连续变化
Text('\uE100')
  .fontFamily('VividSymbol') // 必须是注册时的familyName
  .fontSize(80)
  .fontWeight(this.fontWeightValue) // 滑块值可绑定、驱动可变字体的粗细轴
  .fontColor(Color.Red)

3. 为什么SymbolGlyph不显示?

  • 你的$r('app.string.symbol_custom_my')引用的是字符串资源,这需要你在resource/base/element/string.json中定义该条目的value为图标对应的Unicode码点(如\uE100)。未定义或定义错误都会导致无内容。
  • registerSymbol用于向系统注册分层渲染的Symbol表,但即使调用成功、资源路径正确,SymbolGlyph目前也仅支持官方Symbol的分层特效,无法渲染自定义可变字体的连续粗细变化。注册过程可能因字体与json方案不完全匹配而静默失败,但这对你而言不是关键,因为你的目标用Text即可达成。
回到顶部