HarmonyOS ArkTS 小符号组件(SymbolGlyph SymbolSpan) 详解

HarmonyOS ArkTS 小符号组件(SymbolGlyph / SymbolSpan) 详解

鸿蒙第四期开发者活动

帮你像写笔记一样理解这个组件到底是什么、什么时候用、怎么用、注意事项,没有干巴巴堆属性。基于官方指南以及社区整理资料。华为开发者


一、为什么需要 “符号”(Symbol)组件?

在 UI 设计里,经常会碰到这样的需求:

  • 在按钮或标题前放一个小图标
  • 在某段文本里插入一个图标(比如 ⭐、❤️、📍)
  • 显示系统预置图标(比如网络状态、箭头、系统资源图标)
  • 用图标替代图片资源实现统一风格

普通做法会用 Image 或者文字字体图标(unicode),但这样:

  • 不够语义化
  • 有时渲染颜色与样式难以统一
  • 不够轻量也不利于换肤/主题适配

HarmonyOS ArkTS 就提供了 SymbolGlyphSymbolSpan 两个组件来解决这个问题。华为开发者


二、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. 只支持预置资源

SymbolGlyphSymbolSpan 只支持系统预置的 symbol 资源(如 $r('sys.symbol.ohos_wifi'))。引用非 Symbol 资源会导致不可预测的显示问题。CSDN


2. 大小控制要用 fontSize

不要用 width/height 去控制图标视觉大小,这样只是改变组件占位,而不会真正改变图标尺寸。CSDN


3. 渲染策略影响颜色

如果你传了多个颜色数组但渲染策略还是 SINGLE,只会取第一个颜色;如果想多色显示,一定要配合正确的渲染策略。CSDN


七、总结(像真实开发者写的结论)

  • SymbolGlyph 是一个轻量矢量图标组件,用来显示系统预置符号图标。华为开发者
  • SymbolSpan 是它在文本里的“内联”版本,可在 Text 文本流中插入图标。华为开发者
  • 它们的大小、颜色、粗细和渲染策略可控,并且样式能很好地和文本/布局融为一体。CSDN
  • 在做图标按钮、带图标的列表项、文本混排等 UI 场景时非常好用。华为开发者
posted @ 2025-12-22 08:54  想喝冰咖啡  阅读(0)  评论(0)    收藏  举报