文档管理中心
指南应用框架UI Design Kit(UI设计套件)图标处理(推荐)分层图标处理

(推荐)分层图标处理

场景介绍

从5.0.0(12)版本开始, Hds支持分层图标处理能力。

适用于图标为分层资源,且图标展示风格要与华为HarmonyOS Design System设计风格一致的应用场景。以下是一些典型的应用场景:

  • 展示带图标的应用列表:可调用UI Design Kit批量处理分层图标的接口获取处理后的应用图标。

  • 展示应用详情:可调用UI Design Kit处理单个分层图标的接口获取处理后的应用图标。

  • 展示跟随在线主题的应用图标:可调用UI Design Kit处理分层图标的接口获取主题换肤后的应用图标。

约束条件

分层图标处理支持Phone、Tablet、PC/2in1设备,并且从5.1.1(19)版本开始,新增支持TV设备。

开发步骤

  1. 设置分层图标,将前景资源和背景资源放至entry/src/main/resources/base/media文件中,并在该目录下创建一个json文件(例如:drawable.json):

    收起
    自动换行
    深色代码主题
    复制
    1. {
    2. "layered-image":
    3. {
    4. "background" : "$media:background",
    5. "foreground" : "$media:foreground"
    6. }
    7. }
  2. 将图标处理的相关类添加至工程。

    收起
    自动换行
    深色代码主题
    复制
    1. import { LayeredDrawableDescriptor } from '@kit.ArkUI';
    2. import { hdsDrawable } from '@kit.UIDesignKit';
    3. import { image } from '@kit.ImageKit';
    4. import { BusinessError } from '@kit.BasicServicesKit';
    5. import { resourceManager } from '@kit.LocalizationKit';
    6. import { common } from '@kit.AbilityKit';
  3. 简单配置页面的布局,调用分层图标接口获取处理后的图标信息,也可以调用异步批量处理接口

    收起
    自动换行
    深色代码主题
    复制
    1. @Entry
    2. @Component
    3. struct Index{
    4. bundleName: string = 'com.example.uidesignsample';
    5. resManager: resourceManager.ResourceManager | undefined = undefined;
    6. layeredDrawableDescriptor: LayeredDrawableDescriptor | undefined = undefined;
    7. @State layeredIconsResult: Array<hdsDrawable.ProcessedIcon> = [];
    8. build() {
    9. Column() {
    10. Column() {
    11. Text('getHdsLayeredIcon')
    12. .fontWeight(FontWeight.Bold)
    13. .fontSize(16)
    14. .margin(5)
    15. Image(this.getHdsLayeredIcon())
    16. .width(48)
    17. .height(48)
    18. }
    19. .margin(20)
    20. Text('getHdsLayeredIcons')
    21. .fontWeight(FontWeight.Bold)
    22. .fontSize(16)
    23. .margin(5)
    24. List() {
    25. ForEach(this.layeredIconsResult,
    26. (item: hdsDrawable.ProcessedIcon, index?: number) => {
    27. ListItem() {
    28. Column() {
    29. Text(item.bundleName)
    30. .fontWeight(FontWeight.Medium)
    31. .fontSize(16)
    32. .margin(5)
    33. Image(item.pixelMap)
    34. .width(48)
    35. .height(48)
    36. }
    37. .margin(15)
    38. }
    39. .width('100%')
    40. }, (item: hdsDrawable.ProcessedIcon) => item.toString())
    41. }
    42. .scrollBar(BarState.On)
    43. .height('60%')
    44. }
    45. .height('100%')
    46. .width('100%')
    47. }
    48. aboutToAppear(): void {
    49. // 获取资源管理器
    50. this.resManager = (this.getUIContext().getHostContext() as common.UIAbilityContext)?.resourceManager;
    51. if (!this.resManager) {
    52. return;
    53. }
    54. // 通过资源管理获取原始分层图标信息
    55. this.layeredDrawableDescriptor = (this.resManager.getDrawableDescriptor($r('app.media.drawable')
    56. .id)) as LayeredDrawableDescriptor;
    57. this.getHdsLayeredIcons();
    58. }
    59. private getHdsLayeredIcon(): image.PixelMap | null {
    60. try {
    61. // 调用HDS分层图标接口处理图标
    62. return hdsDrawable.getHdsLayeredIcon(this.bundleName, this.layeredDrawableDescriptor, 48, true);
    63. } catch (err) {
    64. let message = (err as BusinessError).message;
    65. let code = (err as BusinessError).code;
    66. console.error(`getHdsLayeredIcon failed, code: ${code}, message: ${message}`);
    67. return null;
    68. }
    69. }
    70. private getHdsLayeredIcons(): void {
    71. if (!this.layeredDrawableDescriptor) {
    72. console.error(`getHdsLayeredIcons layeredDrawableDescriptor is undefined.`);
    73. return;
    74. }
    75. // 构造批量接口传参
    76. let options: hdsDrawable.Options = {
    77. size: 48,
    78. hasBorder: true,
    79. parallelNumber: 4
    80. };
    81. let layeredIcons: hdsDrawable.LayeredIcon[] = [];
    82. for (let i = 0; i < 10; i++) {
    83. layeredIcons.push({
    84. bundleName: `${this.bundleName}-${i}`,
    85. layeredDrawableDescriptor: this.layeredDrawableDescriptor
    86. });
    87. }
    88. try {
    89. // 调用HDS批量分层接口处理图标
    90. hdsDrawable.getHdsLayeredIcons(layeredIcons, options)
    91. .then((data: Array<hdsDrawable.ProcessedIcon>) => {
    92. console.info(`getHdsLayeredIcons data size: ${data.length}`);
    93. this.layeredIconsResult = data;
    94. })
    95. .catch((err: BusinessError) => {
    96. console.error(`getHdsLayeredIcons return error, code: ${err.code}, msg: ${err.message}`);
    97. });
    98. } catch (err) {
    99. let message = (err as BusinessError).message;
    100. let code = (err as BusinessError).code;
    101. console.error(`getHdsLayeredIcons failed, code: ${code}, message: ${message}`);
    102. }
    103. }
    104. }
在 指南 中进行搜索
请输入您想要搜索的关键词