1# 图标小符号 (SymbolGlyph/SymbolSpan) 2<!--Kit: ArkUI--> 3<!--Subsystem: ArkUI--> 4<!--Owner: @hddgzw--> 5<!--Designer: @pssea--> 6<!--Tester: @jiaoaozihao--> 7<!--Adviser: @HelloCrease--> 8 9SymbolGlyph是图标小符号组件,便于使用精美的图标,如渲染多色图标和使用动效图标。SymbolSpan作为Text组件的子组件,可在文本中穿插显示图标小符号。具体用法请参考[SymbolGlyph](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md)和[SymbolSpan](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md)组件的文档。 10 11 12## 创建图标 13 14SymbolGlyph通过$r引用Resource资源来创建,目前仅支持系统预置的Symbol资源名。<!--RP1--><!--RP1End--> 15 16 ```ts 17 SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus')) 18 .fontSize(96) 19 .renderingStrategy(SymbolRenderingStrategy.SINGLE) 20 .fontColor([Color.Black, Color.Green, Color.White]) 21 ``` 22  23 24 25## 添加到文本中 26 27[SymbolSpan](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md)可作为[Text](../reference/apis-arkui/arkui-ts/ts-basic-components-text.md)的子组件用于显示图标小符号。可以在一个Text组件内添加多个SymbolSpan,从而展示一串连续的图标。 28 29- 创建SymbolSpan。 30 31 SymbolSpan组件需嵌入在Text组件中才能显示,单独使用不会呈现任何内容。 32 33 34 ```ts 35 Text() { 36 SymbolSpan($r('sys.symbol.ohos_trash')) 37 .fontWeight(FontWeight.Normal) 38 .fontSize(96) 39 } 40 ``` 41  42 43 44- 通过[fontSize](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md#fontsize)属性设置SymbolSpan的大小。 45 46 47 ```ts 48 Row() { 49 Column() { 50 Text("48") 51 Text() { 52 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 53 .fontSize(48) 54 .renderingStrategy(SymbolRenderingStrategy.SINGLE) 55 .fontColor([Color.Black, Color.Green, Color.White]) 56 } 57 } 58 59 Column() { 60 Text("72") 61 Text() { 62 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 63 .fontSize(72) 64 .renderingStrategy(SymbolRenderingStrategy.SINGLE) 65 .fontColor([Color.Black, Color.Green, Color.White]) 66 } 67 } 68 69 Column() { 70 Text("96") 71 Text() { 72 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 73 .fontSize(96) 74 .renderingStrategy(SymbolRenderingStrategy.SINGLE) 75 .fontColor([Color.Black, Color.Green, Color.White]) 76 } 77 } 78 } 79 ``` 80  81 82- 通过[fontWeight](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md#fontweight)属性设置SymbolSpan组件的粗细。 83 84 ```ts 85 Row() { 86 Column() { 87 Text("Light") 88 Text() { 89 SymbolSpan($r('sys.symbol.ohos_trash')) 90 .fontWeight(FontWeight.Lighter) 91 .fontSize(96) 92 } 93 } 94 95 Column() { 96 Text("Normal") 97 Text() { 98 SymbolSpan($r('sys.symbol.ohos_trash')) 99 .fontWeight(FontWeight.Normal) 100 .fontSize(96) 101 } 102 } 103 104 Column() { 105 Text("Bold") 106 Text() { 107 SymbolSpan($r('sys.symbol.ohos_trash')) 108 .fontWeight(FontWeight.Bold) 109 .fontSize(96) 110 } 111 } 112 } 113 ``` 114  115 116- 通过[fontColor](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md#fontcolor)属性设置SymbolSpan的颜色。 117 118 ```ts 119 Row() { 120 Column() { 121 Text("Black") 122 Text() { 123 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 124 .fontSize(96) 125 .fontColor([Color.Black]) 126 } 127 } 128 129 Column() { 130 Text("Green") 131 Text() { 132 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 133 .fontSize(96) 134 .fontColor([Color.Green]) 135 } 136 } 137 138 Column() { 139 Text("Pink") 140 Text() { 141 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 142 .fontSize(96) 143 .fontColor([Color.Pink]) 144 } 145 } 146 } 147 ``` 148  149 150- 通过[renderingStrategy](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md#renderingstrategy)属性设置SymbolSpan的渲染策略。 151 152 ```ts 153 Row() { 154 Column() { 155 Text("单色") 156 Text() { 157 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 158 .fontSize(96) 159 .renderingStrategy(SymbolRenderingStrategy.SINGLE) 160 .fontColor([Color.Black, Color.Green, Color.White]) 161 } 162 } 163 164 Column() { 165 Text("多色") 166 Text() { 167 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 168 .fontSize(96) 169 .renderingStrategy(SymbolRenderingStrategy.MULTIPLE_COLOR) 170 .fontColor([Color.Black, Color.Green, Color.White]) 171 } 172 } 173 174 Column() { 175 Text("分层") 176 Text() { 177 SymbolSpan($r('sys.symbol.ohos_folder_badge_plus')) 178 .fontSize(96) 179 .renderingStrategy(SymbolRenderingStrategy.MULTIPLE_OPACITY) 180 .fontColor([Color.Black, Color.Green, Color.White]) 181 } 182 } 183 } 184 ``` 185  186 187- 通过[effectStrategy](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolSpan.md#effectstrategy)属性设置SymbolSpan的动效策略。 188 189 ```ts 190 Row() { 191 Column() { 192 Text("无动效") 193 Text() { 194 SymbolSpan($r('sys.symbol.ohos_wifi')) 195 .fontSize(96) 196 .effectStrategy(SymbolEffectStrategy.NONE) 197 } 198 } 199 200 Column() { 201 Text("整体缩放动效") 202 Text() { 203 SymbolSpan($r('sys.symbol.ohos_wifi')) 204 .fontSize(96) 205 .effectStrategy(SymbolEffectStrategy.SCALE) 206 } 207 } 208 209 Column() { 210 Text("层级动效") 211 Text() { 212 SymbolSpan($r('sys.symbol.ohos_wifi')) 213 .fontSize(96) 214 .effectStrategy(SymbolEffectStrategy.HIERARCHICAL) 215 } 216 } 217 } 218 ``` 219  220 221- SymbolSpan不支持通用事件。 222 223## 自定义图标动效 224 225相较于effectStrategy属性在启动时即触发动效,可以通过以下两种方式来控制动效的播放状态,以及选择更多样化的动效策略。 226 227关于effectStrategy属性与symbolEffect属性的多种动态属性使用及生效原则,详情请参阅[SymbolGlyph.symbolEffect](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#symboleffect12-1)属性的说明。 228 229- 通过设置SymbolEffect属性,可以同时配置SymbolGlyph的动效策略和播放状态。 230 231 ```ts 232 @State isActive: boolean = true; 233 Column() { 234 Text("可变颜色动效") 235 SymbolGlyph($r('sys.symbol.ohos_wifi')) 236 .fontSize(96) 237 .symbolEffect(new HierarchicalSymbolEffect(EffectFillStyle.ITERATIVE), this.isActive) 238 Button(this.isActive ? '关闭' : '播放').onClick(() => { 239 this.isActive = !this.isActive; 240 }) 241 } 242 ``` 243  244 245- 通过设置SymbolEffect属性,可以同时指定SymbolGlyph的动画效果策略及其播放触发条件。 246 247 ```ts 248 @State triggerValueReplace: number = 0; 249 Column() { 250 Text("弹跳动效") 251 SymbolGlyph($r('sys.symbol.ellipsis_message_1')) 252 .fontSize(96) 253 .fontColor([Color.Gray]) 254 .symbolEffect(new BounceSymbolEffect(EffectScope.WHOLE, EffectDirection.UP), this.triggerValueReplace) 255 Button('trigger').onClick(() => { 256 this.triggerValueReplace = this.triggerValueReplace + 1; 257 }) 258 } 259 ``` 260  261 262- 从API version 20开始,支持通过设置SymbolEffect属性为[ReplaceSymbolEffect](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#replacesymboleffect12),设置[ReplaceEffectType](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#replaceeffecttype20枚举说明)为ReplaceEffectType.SLASH_OVERLAY,可以指定SymbolGlyph的禁用动画效果及其播放触发条件。 263 264 ```ts 265 @State triggerValueReplace: number = 0; 266 @State renderMode: number = 1; 267 replaceFlag: boolean = true; 268 269 Column() { 270 Text("禁用动效") 271 SymbolGlyph(this.replaceFlag ? $r('sys.symbol.eye_slash') : $r('sys.symbol.eye')) 272 .fontSize(96) 273 .renderingStrategy(this.renderMode) 274 .symbolEffect(new ReplaceSymbolEffect(EffectScope.LAYER, ReplaceEffectType.SLASH_OVERLAY), this.triggerValueReplace) 275 Button('trigger').onClick(() => { 276 this.replaceFlag = !this.replaceFlag; 277 this.triggerValueReplace = this.triggerValueReplace + 1; 278 }) 279 } 280 ``` 281  282 283- 从API version 20开始,支持通过设置SymbolEffect属性为[ReplaceSymbolEffect](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#replacesymboleffect12),设置[ReplaceEffectType](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#replaceeffecttype20枚举说明)为ReplaceEffectType.CROSS_FADE,可以指定SymbolGlyph的快速替换动画效果及其播放触发条件。 284 285 ```ts 286 @State triggerValueReplace: number = 0; 287 replaceFlag: boolean = true; 288 289 Column() { 290 Text("快速替换动效") 291 SymbolGlyph(this.replaceFlag ? $r('sys.symbol.checkmark_circle') : $r('sys.symbol.repeat_1')) 292 .fontSize(96) 293 .symbolEffect(new ReplaceSymbolEffect(EffectScope.WHOLE, ReplaceEffectType.CROSS_FADE), this.triggerValueReplace) 294 Button('trigger').onClick(() => { 295 this.replaceFlag = !this.replaceFlag; 296 this.triggerValueReplace = this.triggerValueReplace + 1; 297 }) 298 } 299 ``` 300  301 302## 设置阴影和渐变色 303 304- 从API version 20开始,支持通过[symbolShadow](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#symbolshadow20)接口实现了symbolGlyph组件显示阴影效果。 305 306 ```ts 307 @State isActive: boolean = true; 308 309 options: ShadowOptions = { 310 radius: 10.0, 311 color: Color.Blue, 312 offsetX: 10, 313 offsetY: 10, 314 }; 315 316 Column() { 317 Text("阴影能力") 318 SymbolGlyph($r('sys.symbol.ohos_wifi')) 319 .fontSize(96) 320 .symbolEffect(new HierarchicalSymbolEffect(EffectFillStyle.ITERATIVE), !this.isActive) 321 .symbolShadow(this.options) 322 Button(!this.isActive ? '关闭' : '播放').onClick(() => { 323 this.isActive = !this.isActive; 324 }) 325 } 326 ``` 327  328 329- 从API version 20开始,支持通过[shaderStyle](../reference/apis-arkui/arkui-ts/ts-basic-components-symbolGlyph.md#shaderstyle20)接口实现了symbolGlyph组件显示渐变色效果。 330 331 ```ts 332 radialGradientOptions: RadialGradientOptions = { 333 center: ["50%", "50%"], 334 radius: "20%", 335 colors: [[Color.Red, 0.0], [Color.Blue, 0.3], [Color.Green, 0.5]], 336 repeating: true, 337 }; 338 339 Column() { 340 Text('径向渐变') 341 .fontSize(18) 342 .fontColor(0xCCCCCC) 343 .textAlign(TextAlign.Center) 344 SymbolGlyph($r('sys.symbol.ohos_folder_badge_plus')) 345 .fontSize(96) 346 .shaderStyle([new RadialGradientStyle(this.radialGradientOptions)]) 347 } 348 ``` 349  350 351## 添加事件 352 353SymbolGlyph组件可以添加通用事件,例如绑定[onClick](../reference/apis-arkui/arkui-ts/ts-universal-events-click.md#onclick)、[onTouch](../reference/apis-arkui/arkui-ts/ts-universal-events-touch.md#ontouch)等事件来响应操作。 354 355```ts 356@State wifiColor: ResourceColor = Color.Black; 357SymbolGlyph($r('sys.symbol.ohos_wifi')) 358 .fontSize(96) 359 .fontColor([this.wifiColor]) 360 .onClick(() => { 361 this.wifiColor = Color.Gray; 362 }) 363``` 364 365 366## 场景示例 367 368该示例通过symbolEffect、fontSize、fontColor属性展示了播放列表的效果。 369 370```ts 371// xxx.ets 372@Entry 373@Component 374struct Index { 375 @State triggerValueReplace: number = 0; 376 @State symbolSources: Resource[] = 377 [$r('sys.symbol.repeat'), $r('sys.symbol.repeat_1'), $r('sys.symbol.arrow_left_arrow_right')]; 378 @State symbolSourcesIndex: number = 0; 379 @State symbolText: string[] = ['顺序播放', '单曲循环', '随机播放']; 380 @State symbolTextIndex: number = 0; 381 @State fontColorValue: ResourceColor = Color.Grey; 382 @State fontColorValue1: ResourceColor = '#E8E8E8'; 383 384 build() { 385 Column({ space: 10 }) { 386 Row() { 387 Text() { 388 Span('当前播放列表') 389 .fontSize(20) 390 .fontWeight(FontWeight.Bolder) 391 Span('(101)') 392 } 393 } 394 395 Row() { 396 Row({ space: 5 }) { 397 SymbolGlyph(this.symbolSources[this.symbolSourcesIndex]) 398 .symbolEffect(new ReplaceSymbolEffect(EffectScope.WHOLE), this.triggerValueReplace) 399 .fontSize(20) 400 .fontColor([this.fontColorValue]) 401 Text(this.symbolText[this.symbolTextIndex]) 402 .fontColor(this.fontColorValue) 403 } 404 .onClick(() => { 405 this.symbolTextIndex++; 406 this.symbolSourcesIndex++; 407 this.triggerValueReplace++; 408 if (this.symbolSourcesIndex > (this.symbolSources.length - 1)) { 409 this.symbolSourcesIndex = 0; 410 this.triggerValueReplace = 0; 411 } 412 if (this.symbolTextIndex > (this.symbolText.length - 1)) { 413 this.symbolTextIndex = 0; 414 } 415 }) 416 .width('75%') 417 418 Row({ space: 5 }) { 419 Text() { 420 SymbolSpan($r('sys.symbol.arrow_down_circle_badge_vip_circle_filled')) 421 .fontColor([this.fontColorValue]) 422 .fontSize(20) 423 } 424 425 Text() { 426 SymbolSpan($r('sys.symbol.heart_badge_plus')) 427 .fontColor([this.fontColorValue]) 428 .fontSize(20) 429 } 430 431 Text() { 432 SymbolSpan($r('sys.symbol.ohos_trash')) 433 .fontColor([this.fontColorValue]) 434 .fontSize(20) 435 } 436 } 437 .width('25%') 438 } 439 440 Divider().width(5).color(this.fontColorValue1).width('98%') 441 Row() { 442 Row() { 443 Text("歌曲一") 444 }.width('82%') 445 446 Row({ space: 5 }) { 447 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 448 .fontColor([this.fontColorValue]) 449 .fontSize(20) 450 SymbolGlyph($r('sys.symbol.trash')) 451 .fontColor([this.fontColorValue]) 452 .fontSize(20) 453 } 454 } 455 456 Divider().width(5).color(this.fontColorValue1).width('98%') 457 Row() { 458 Row() { 459 Text("歌曲二") 460 }.width('82%') 461 462 Row({ space: 5 }) { 463 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 464 .fontColor([this.fontColorValue]) 465 .fontSize(20) 466 SymbolGlyph($r('sys.symbol.trash')) 467 .fontColor([this.fontColorValue]) 468 .fontSize(20) 469 } 470 } 471 472 Divider().width(5).color(this.fontColorValue1).width('98%') 473 Row() { 474 Row() { 475 Text("歌曲三") 476 }.width('82%') 477 478 Row({ space: 5 }) { 479 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 480 .fontColor([this.fontColorValue]) 481 .fontSize(20) 482 SymbolGlyph($r('sys.symbol.trash')) 483 .fontColor([this.fontColorValue]) 484 .fontSize(20) 485 } 486 } 487 488 Divider().width(5).color(this.fontColorValue1).width('98%') 489 Row() { 490 Row() { 491 Text("歌曲四") 492 }.width('82%') 493 494 Row({ space: 5 }) { 495 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 496 .fontColor([this.fontColorValue]) 497 .fontSize(20) 498 SymbolGlyph($r('sys.symbol.trash')) 499 .fontColor([this.fontColorValue]) 500 .fontSize(20) 501 } 502 } 503 504 Divider().width(5).color(this.fontColorValue1).width('98%') 505 Row() { 506 Row() { 507 Text("歌曲五") 508 }.width('82%') 509 510 Row({ space: 5 }) { 511 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 512 .fontColor([this.fontColorValue]) 513 .fontSize(20) 514 SymbolGlyph($r('sys.symbol.trash')) 515 .fontColor([this.fontColorValue]) 516 .fontSize(20) 517 } 518 } 519 520 Divider().width(5).color(this.fontColorValue1).width('98%') 521 Row() { 522 Row() { 523 Text("歌曲六") 524 }.width('82%') 525 526 Row({ space: 5 }) { 527 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 528 .fontColor([this.fontColorValue]) 529 .fontSize(20) 530 SymbolGlyph($r('sys.symbol.trash')) 531 .fontColor([this.fontColorValue]) 532 .fontSize(20) 533 } 534 } 535 536 Divider().width(5).color(this.fontColorValue1).width('98%') 537 Row() { 538 Row() { 539 Text("歌曲七") 540 }.width('82%') 541 542 Row({ space: 5 }) { 543 SymbolGlyph($r('sys.symbol.play_arrow_triangle_2_circlepath')) 544 .fontColor([this.fontColorValue]) 545 .fontSize(20) 546 SymbolGlyph($r('sys.symbol.trash')) 547 .fontColor([this.fontColorValue]) 548 .fontSize(20) 549 } 550 } 551 552 Divider().width(5).color(this.fontColorValue1).width('98%') 553 Column() { 554 Text("关闭") 555 } 556 .alignItems(HorizontalAlign.Center) 557 .width('98%') 558 } 559 .alignItems(HorizontalAlign.Start) 560 .width('100%') 561 .height(400) 562 .padding({ 563 left: 10, 564 top: 10 565 }) 566 } 567} 568``` 569 570