还在到处的找图标?先来看看系统带的两千多个是否满足。在 HarmonyOS 的应用开发中,SymbolGlyph 是一个非常实用的组件,用于显示系统预置的小图标符号。它不仅支持手机、平板、手表等多种设备,还兼容 ArkTS 卡片和元服务,从API 11开始就已经被引入,并且在API 12及其之后的版本中增加了更多功能,如颜色控制、动效和高级渲染策略等。
这些特性让开发者无需再为UI设计资源而烦恼,涵盖了常用的icon图标资源。同时也能确保开发出的应用与原生鸿蒙风格保持一致。
官方图标库网站:
- HarmonyOS Symbol 主题图标库:
- https://developer.huawei.com/consumer/cn/design/harmonyos-symbol/

官方文档上介绍了两千多种,但是还是不完整。以下为网友总结的所有图标示例:
开源图标库:
- https://gitee.com/awa_Liny/Linys_Ani_Examples_NEXT
- https://github.com/awaLiny2333/Linys_Ani_Examples_NEXT
1. SymbolGlyph 基本介绍和接口
SymbolGlyph 组件通过构造函数接受一个指定的图标资源,该资源必须是系统预置的 symbol 资源,例如 $r('sys.symbol.ohos_wifi')
,而不是自定义资源。如果使用不正确的资源,图标将无法正确显示。此外,SymbolGlyph 不支持子组件,也就是说你不能将其他组件嵌入到 SymbolGlyph 中来。
代码示例:
typescript
// 创建一个Wi-Fi图标,默认大小
SymbolGlyph($r('sys.symbol.ohos_wifi'))
// 创建一个文件夹图标,并指定资源名称
SymbolGlyph($r('sys.symbol.ohos_folder'))
2. 颜色控制属性:fontColor
fontColor 属性允许你设置图标的颜色。你可以通过数组的方式指定多个颜色,图标会根据渲染策略选择颜色。从API 12开始,fontColor 属性也支持在卡片和元服务中使用。
代码示例:
typescript
// 设置单色:黑色
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontColor([Color.Black])
// 设置多色:黑、绿、白(实际显示颜色取决于渲染策略)
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.fontColor([Color.Black, Color.Green, Color.White])
3. 大小控制属性:fontSize
fontSize 属性用于控制图标的大小,单位为 fp(比如 "16fp")。该属性支持数字、字符串或 Resource 类型作为参数。需要注意的是,不要使用百分比形式的字符串,否则会导致错误。图标实际大小仅由 fontSize 决定,即便设置了 width 或 height,它们只会影响组件所占据的空间大小,而不改变图标本身的大小。
代码示例:
typescript
// 设置大小为20fp
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(20)
// 使用字符串形式设置大小
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontSize("24fp") // 等价于24
4. 粗细控制属性:fontWeight
fontWeight 属性可以调整图标的线条粗细,取值范围从 100 到 900,间隔为 100,也可以使用字符串形式如 "bold" 或 "lighter"。不过,并非所有的图标都支持 fontWeight 属性,比如 sys.symbol.ohos_lungs
就不支持。从API 12开始,fontWeight 属性同样适用于卡片和元服务。
代码示例:
typescript
// 设置正常粗细
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Normal)
// 设置粗体,使用字符串形式
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontWeight("bold")
5. 渲染策略属性:renderingStrategy
renderingStrategy 属性决定了图标的上色方式,有三种模式:SINGLE(单色)、MULTIPLE_COLOR(多色)、MULTIPLE_OPACITY(分层透明)。默认情况下,renderingStrategy 为 SINGLE,只使用数组中的第一个颜色。MULTIPLE_COLOR 和 MULTIPLE_OPACITY 则分别使用最多三个颜色或自动添加透明度。
代码示例:
typescript
// 单色模式:只生效第一个颜色(黑色)
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.renderingStrategy(SymbolRenderingStrategy.SINGLE)
.fontColor([Color.Black, Color.Green])
// 多色模式:三色生效(黑、绿、白)
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
.fontColor([Color.Black, Color.Green, Color.White])
6. 动效策略属性:effectStrategy
effectStrategy 属性为图标添加动画效果,支持 NONE(无动效)、SCALE(整体缩放)、HIERARCHICAL(层级动效)。在设置 effectStrategy 属性后,动效会自动生效,无需额外触发。需要注意的是,不要将 effectStrategy 和 symbolEffect 属性混用,否则可能会产生冲突。
代码示例:
typescript
// 无动效
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.effectStrategy(SymbolEffectStrategy.NONE)
// 整体缩放动效
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.effectStrategy(1) // 等价于SymbolEffectStrategy.SCALE
7. 高级动效属性:symbolEffect
symbolEffect 属性提供了更灵活的动效设置方式,支持多种动效类型如缩放、层级、脉冲等,还可以控制播放状态(isActive)或触发器(triggerValue)。从API 12开始支持卡片和元服务。symbolEffect 对象包括 ScaleSymbolEffect(缩放)、HierarchicalSymbolEffect(层级)等,每个对象都有自己的构造参数如 scope(范围)、direction(方向)等,使用 triggerValue 时,图标会在数值变化时触发动效,非常适合交互场景。
代码示例:
typescript
// 层级动效,播放状态为true
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.symbolEffect(new HierarchicalSymbolEffect(EffectFillStyle.ITERATIVE), true)
// 替换动效,由触发器控制
@State triggerValue: number = 0;
SymbolGlyph($r('sys.symbol.checkmark_circle'))
.symbolEffect(new ReplaceSymbolEffect(), triggerValue)
Button('trigger').onClick(() => {
this.triggerValue = this.triggerValue + 1;
})
SymbolSpan 和 SymbolGlyph 的异同点
相同点:
- 都是用于显示图标小符号的组件。
- 都不支持子组件。
- 都仅支持系统预置的 symbol 资源名,引用非 symbol 资源将显示异常。
不同点:
- SymbolSpan 仅支持作为 Text 组件的子组件,而 SymbolGlyph 不能作为 Text 组件的子组件。
示例代码
示例1:设置渲染和动效策略
typescript
// xxx.ets
@Entry
@Component
struct Index {
build() {
Column() {
Row() {
Column() {
Text("Light")
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Lighter)
.fontSize(96)
}
Column() {
Text("Normal")
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Normal)
.fontSize(96)
}
Column() {
Text("Bold")
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Bold)
.fontSize(96)
}
}
Row() {
Column() {
Text("单色")
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.fontSize(96)
.renderingStrategy(SymbolRenderingStrategy.SINGLE)
.fontColor([Color.Black, Color.Green, Color.White])
}
Column() {
Text("多色")
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.fontSize(96)
.renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
.fontColor([Color.Black, Color.Green, Color.White])
}
Column() {
Text("分层")
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.fontSize(96)
.renderingStrategy(SymbolRenderingStrategy.MULTIPLE_OPACITY)
.fontColor([Color.Black, Color.Green, Color.White])
}
}
Row() {
Column() {
Text("无动效")
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(96)
.effectStrategy(SymbolEffectStrategy.NONE)
}
Column() {
Text("整体缩放动效")
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(96)
.effectStrategy(1) // 等价于SymbolEffectStrategy.SCALE
}
Column() {
Text("层级动效")
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(96)
.effectStrategy(2) // 等价于SymbolEffectStrategy.HIERARCHICAL
}
}
}
}
}
示例2:设置动效
typescript
// xxx.ets
@Entry
@Component
struct Index {
@State isActive: boolean = true;
@State triggerValueReplace: number = 0;
replaceFlag: boolean = true;
build() {
Column() {
Row() {
Column() {
Text("可变颜色动效")
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(96)
.symbolEffect(new HierarchicalSymbolEffect(EffectFillStyle.ITERATIVE), this.isActive)
Button(this.isActive ? '关闭' : '播放').onClick(() => {
this.isActive = !this.isActive;
})
}.margin({ right: 20 })
Column() {
Text("替换动效")
SymbolGlyph(this.replaceFlag ? $r('sys.symbol.checkmark_circle') : $r('sys.symbol.repeat_1'))
.fontSize(96)
.symbolEffect(new ReplaceSymbolEffect(EffectScope.WHOLE), this.triggerValueReplace)
Button('trigger').onClick(() => {
this.replaceFlag = !this.replaceFlag;
this.triggerValueReplace = this.triggerValueReplace + 1;
})
}
}
}.margin({
left: 30,
top: 50
})
}
}
SymbolGlyph 真正是一个宝藏组件!从基础的图标显示到复杂的动效设计,它都能胜任。通过 fontColor、fontSize、renderingStrategy 等属性,你可以轻松定制图标的外观;effectStrategy 和 symbolEffect 则让图标能够动起来,提升用户体验。记住关键点:只使用系统资源、避免属性混用、多利用枚举简化代码。结合事件支持,你能够创建出超交互的界面。希望这篇口语化解析能够帮助你快速上手 SymbolGlyph,所有代码示例都可以直接复制到你的项目中使用。
参考文档:
- SymbolSpan 参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-basic-components-symbolspan-V13
- SymbolGlyph 参考文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V13/ts-basic-components-symbolglyph-V13
参考链接: