做过 iOS 和安卓图标的开发者,第一次做鸿蒙图标时常会有疑问:直接拿 iOS 的 1024 图标改一改能不能用?要不要自己画圆角?
HarmonyOS(尤其是纯血鸿蒙版本)推荐使用分层图标:把图标拆成前景层和背景层两张图,由系统统一加上外形遮罩,并在不同场景下做视觉效果处理。这和安卓的自适应图标(Adaptive Icon)思路相近,但和 iOS 的「一张图交给系统切圆角」不完全一样。
| 对比项 | iOS | 安卓自适应图标 | 鸿蒙分层图标 |
|---|---|---|---|
| 源文件结构 | 单张(或 Icon Composer 分层) | 前景 + 背景 | 前景 + 背景 |
| 外形遮罩 | 系统统一 | 由厂商系统决定 | 系统统一 |
| 是否自己画圆角 | 不需要 | 不需要 | 不需要 |
| 主体留白 | 需要 | 需要安全区 | 需要安全区 |
本文以实操为主,具体尺寸和比例以华为开发者官网最新的设计规范和 DevEco Studio 的提示为准。
分层的好处主要有三点:
如果你只提供一张已经切好圆角、带阴影的完整图标,在加上系统遮罩后,很容易出现「圆角里套圆角」「四周有白边」这类问题。
一般建议前景层和背景层都按 1024×1024 px 的正方形画布准备,导出为 PNG。这样既能满足高分辨率设备,也方便后续缩放到各种尺寸。
一个常用的检查方法:把前景层缩小到实际桌面图标大小(几十像素),再叠加一个圆角矩形遮罩,看看主体是否完整、是否显得太大或太小。
在 DevEco Studio 创建的鸿蒙工程里,分层图标通常这样组织:
resources/base/media/ 目录下,比如 foreground.png 和 background.png;layered_image.json:{
"layered-image": {
"background": "$media:background",
"foreground": "$media:foreground"
}
}
module.json5 中,把入口能力(EntryAbility)的 icon 指向 $media:layered_image;app.json5 中的应用图标也做相应配置。不同版本的 SDK 和模板在细节上可能有变化,建议以新建工程时自动生成的默认配置为参考,再替换成自己的图片。
这一点经常被混淆:
| 图标类型 | 用途 | 准备方式 |
|---|---|---|
| 应用内图标(分层) | 安装后在桌面等位置显示 | 前景 + 背景,打包进应用 |
| 商店展示图标 | AppGallery 详情页、搜索结果 | 在 AppGallery Connect 后台单独上传 |
商店展示图标通常需要上传一张完整的正方形 PNG,具体像素尺寸和文件大小以 AppGallery Connect 上传页面的提示为准。建议用分层图标的前景和背景合成后导出,保证商店里看到的图标和桌面上的一致,避免用户「下载后找不到图标」。
根据开发者社区的常见反馈,图标问题主要集中在下面几类:
如果你已经有 iOS 或安卓的图标,可以按这个顺序迁移:
layered_image.json 引用路径正确,module.json5 指向正确鸿蒙图标的关键在于「分层思维」:背景负责铺色,前景负责表达,外形交给系统。只要源文件拆分正确、主体留足安全区,再保证商店图标和应用内图标一致,大部分图标相关的审核问题都可以提前避免。