HarmonyOS ArkTS 小符号组件(SymbolGlyph SymbolSpan) 详解
HarmonyOS ArkTS 小符号组件(SymbolGlyph / SymbolSpan) 详解
帮你像写笔记一样理解这个组件到底是什么、什么时候用、怎么用、注意事项,没有干巴巴堆属性。基于官方指南以及社区整理资料。华为开发者
一、为什么需要 “符号”(Symbol)组件?
在 UI 设计里,经常会碰到这样的需求:
- 在按钮或标题前放一个小图标
- 在某段文本里插入一个图标(比如 ⭐、❤️、📍)
- 显示系统预置图标(比如网络状态、箭头、系统资源图标)
- 用图标替代图片资源实现统一风格
普通做法会用 Image 或者文字字体图标(unicode),但这样:
- 不够语义化
- 有时渲染颜色与样式难以统一
- 不够轻量也不利于换肤/主题适配
HarmonyOS ArkTS 就提供了 SymbolGlyph 和 SymbolSpan 两个组件来解决这个问题。华为开发者
二、SymbolGlyph 与 SymbolSpan 是什么?
1.SymbolGlyph
这是一个图标小符号组件,专门用来显示系统预置的图标资源(如 Wi-Fi、文件夹等)。
它通常用来直接显示一个独立的图标,与 Image 不同的是它是矢量图标,支持动态设色和大小变化。华为开发者
- 适合:按钮图标、状态提示、列表项左侧图标等
- 不能放子组件(只显示图标)CSDN
2. SymbolSpan
这是一个可以放在 Text(文本)内部的符号片段,可以让图标跟文字“挤在一起”显示。常见于:
- 文本里穿插图标
- 图标+文字组合标签
- Emoji 之外的 UI 图标
- 文本提示里的辅助图形
内部原理类似 Text 的 Span,但显示的是符号图标,而不是文字。华为开发者
三、常用 API 属性(按人读得懂的方式讲)
下面这些属性是在开发中你最可能用到的,顺序按重要程度排序。
fontSize(...) — 控制图标大小
不管是 SybolGlyph 还是 SymbolSpan,图标大小主要由 fontSize 决定:
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(20)
它接受数字、字符串、资源引用(不建议用百分比字符串)。这个值直接控制图标渲染大小。CSDN
fontColor([...]) — 控制图标颜色
与 Text 的 fontColor 不同,SymbolGlyph 支持数组式颜色:
- 单色:只传一个颜色
- 多色:传多个颜色数组,图标根据渲染策略分配颜色
例子:
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.fontColor([Color.Black, Color.Green, Color.White])
多色图标显示更丰富,但要注意渲染策略(下面讲)。CSDN
fontWeight(...) — 图标粗细
可以配置图标的“线条粗细”,取值范围是 100~900,也支持常用的字符串:
SymbolGlyph($r('sys.symbol.ohos_trash'))
.fontWeight(FontWeight.Bold)
注意:部分系统图标本身可能不支持修改粗细,这时设置也不会生效。CSDN
renderingStrategy(...) — 渲染策略
决定图标上色方式:
| 策略 | 说明 |
|---|---|
SINGLE |
单色模式,只用第一个颜色 |
MULTIPLE_COLOR |
多色模式,尽可能靠颜色数组渲染 |
MULTIPLE_OPACITY |
分层透明渲染 |
举例:
SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus'))
.renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR)
.fontColor([Color.Black, Color.Green])
默认是 SINGLE,只生效数组中的第一个颜色。CSDN
effectStrategy(...) — 动效策略
可以给图标添加动效策略(比如 pulse、fade 等策略,具体支持的效果需要查你的 SDK 版本 API 参考)。如果不设置,它默认无动效。CSDN
🔧 四、SymbolGlyph / SymbolSpan 的基本用法
1. 单独显示一个系统图标
SymbolGlyph($r('sys.symbol.ohos_wifi'))
.fontSize(24)
.fontColor([Color.Black])
这是最常见的用法,用它替代 Image + ColorTint,方便、轻量。华为开发者
2. 文本里插入图标(用 SymbolSpan)
Text() {
Text('当前状态:')
SymbolSpan($r('sys.symbol.ohos_wifi'))
.fontSize(18)
.fontColor([Color.Green])
Text(' 已连接')
}
这种写法比用多个 Row/Text 组合更干净。华为开发者
3. 配合按钮或 Row 列表使用
如果你有一个带图标的按钮或列表项:
Row({ space: 8, alignItems: ItemAlign.Center }) {
SymbolGlyph($r('sys.symbol.ohos_folder'))
.fontSize(20)
.fontColor([Color.Blue])
Text('文件夹')
}
这种组合写法比 Image + Text 更统一,更容易做动态主题/换色处理。华为开发者
五、什么时候用它最合适
替代静态图片图标
用静态图片做图标会有体积、切图、缩放、颜色适配的问题,而 SymbolGlyph 是矢量图标,自动适配尺寸与视网膜屏。华为开发者
文本 + 图标混排场景
比如“⭐ 评分 4.8/5”、“ 警告信息”,用 SymbolSpan 能让你在一段文字里直接插图标。华为开发者
UI Icon 统一规范
HarmonyOS 系统图标预置了大量 sys.symbol.* 资源,你用它可以确保 UI 风格和系统风格一致,无需自己设计图标库。CSDN
六、常见注意事项(实战总结)
1. 只支持预置资源
SymbolGlyph 和 SymbolSpan 只支持系统预置的 symbol 资源(如 $r('sys.symbol.ohos_wifi'))。引用非 Symbol 资源会导致不可预测的显示问题。CSDN
2. 大小控制要用 fontSize
不要用 width/height 去控制图标视觉大小,这样只是改变组件占位,而不会真正改变图标尺寸。CSDN
3. 渲染策略影响颜色
如果你传了多个颜色数组但渲染策略还是 SINGLE,只会取第一个颜色;如果想多色显示,一定要配合正确的渲染策略。CSDN
浙公网安备 33010602011771号