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
Unicode要配置到0x100000以上 这个是我真正遇到的问题,华为 客户支持工程师 的帮助 我解决了,我也录制了视频解释了 Symbol 制作的过程,有兴趣可以看看 bilibili.com/video/BV18eo7BGEzf。
在HarmonyOS开发中加载自定义Symbol失败,可按以下步骤排查解决:
- 检查文件约束:确认SVG文件格式符合官方要求,视图大小、命名空间没有错误,文件路径和名称没有拼写错误。
- 核对资源配置:检查资源注册路径、配置项是否正确,确保资源已经正确纳入项目编译。
- 检查环境配置:确认工程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加载失败常见原因:
- Symbol资源未正确打包到.har或.hsp中,需检查oh-package.json5的resource配置
- Symbol文件名或ID与代码引用的@ohos/resources路径不一致
- 使用了不被支持的SVG属性(如渐变、滤镜),建议转换为系统支持的矢量格式
请确认资源文件放置在resources/base/media目录下,并重新编译。
你的自定义Symbol不显示且粗细无级变的问题,原因和方案如下:
1. 核心原因:
SymbolGlyph不支持自定义可变字体的连续fontWeight属性。SymbolGlyph的fontWeight参数是为系统Symbol的分层渲染设计的(仅通过FontWeight枚举切换预设层级),无法应用到自定义字体的可变轴。Text组件已能实现你的需求。你在Text组件中使用\uE100配合fontFamily就能看到图标,这证明了字体文件和注册本身没有问题。Text的fontWeight可传递数值,从而驱动可变字体的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即可达成。



