ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Android自适应图标前景图后景图原理与配置完全指南

Android自适应图标前景图后景图原理与配置完全指南 只要是做客户端应用开发的基本都会遇到这个问题——明明素材搞得挺漂亮图标一装上手机就变形、被裁剪或者安装前后颜色不对。“前景图和后景图”这个概念是 Android 8.0 引入自适应图标之后才被反复提起的。简单说系统不再认一个扁平固定的PNG而是要求你把图标拆成一个“背景层”和几个“前景层”再用不同形状的模板裁切。这篇文章我从原理讲到实操把配置流程、尺寸规范、适配动态主题的坑一次说清楚希望能帮你省下反复调图标的半天时间。1. 从单一图标到双层图标前景图与后景图的由来1.1 为什么要把图标拆成两层在 Android 8.0API 26之前应用图标就是一张方方正正的图片系统按启动器设定的形状硬裁四周经常被切掉。后来各家厂商的手机开始用圆形、圆角方形、水滴形等不同图标形状统一一张图标根本没法同时满足。自适应图标Adaptive Icon就是为这个场景设计的系统提供背景层和前景层由设备决定最终要什么形状然后用 mask 统一裁切。背景层理解成桌布前景层理解成铺在上面的主图形。桌布永远不会被裁掉主图形则被限制在安全区域内系统以不同 mask 裁切时松开手指和收拢到中心的效果都能被保留下来。换句话说拆成两层不是为了多一步操作而是为了在不同形态的安卓桌面上都能保持视觉完整。相比一张静态图这个方案的另一个好处是支持动画效果。比如近年来的动态主题图标、按压时的视差效果都是靠前景层和背景层独立位移实现的。图标不再是一张写死的图片而是一套可响应系统状态的结构。1.2 前景图和后景图各自是什么格式要求前景图Foreground是图标内容的核心图形比如一个相机、一个齿轮、一只小猫。它必须保留透明区域通常使用带透明通道的PNG或Vector Drawable。背景图Background则是衬底的纯色、渐变或图案也支持透明但实战中不会透明因为要保证任何 mask 下都不会露底。两者尺寸必须一致默认画布是 108 x 108 dp。注意这里不是 108x108px后续设备密度不同具体像素会换算但逻辑尺寸必须统一。如果前景图比背景图小很多视觉上会失衡如果超出安全区域太多裁切后边缘可能过于贴近边界显得压抑。格式方面我强烈推荐 Vector Drawable矢量图。位图PNG需要为 mdpi、hdpi、xhdpi、xxhdpi、xxxhdpi 各准备一套体积大且稍加缩放就发糊。矢量图只需要一份 XML任何密度下都清晰Image Asset 生成时也会默认把 PNG 转为 Vector。如果设计资源是 SVG直接用 Android Studio 导入为 Vector Drawable 最省事。位图也不是不能用但至少准备一张 1024x1024 的高清图让系统缩放有余量。2. 配置步骤Android Studio 里的标准做法2.1 用 Image Asset 生成自适应图标绝大多数项目是从模板起步的直接在res目录上右键选择New Image Asset。这一步就能看到 Adaptive Icon 的配置界面分Foreground Layer和Background Layer两块。Foreground Layer 选择Asset Type Image导入前景图。右侧Resize滑杆控制缩放比例默认 100% 表示前景图铺满整个 108dp 画布但系统最终只会显示中心圆形安全区域直径约 66dp所以你看到的即所得往往不等于最终效果。我一般会把前景图的主图形缩小到画布直径的 50%~60% 左右也就是让主图形落在中间的 66dp 内四周留出足够的呼吸空间。Background Layer 可以导入背景图片也可以用Color直接选一个纯色。如果背景是一个带纹理的图片注意图片本身要稍微扩展一圈因为系统 mask 裁切时可能会有缩放。设置完毕后点击Next确认资源名称默认ic_launcherAndroid Studio 会生成两套文件mipmap 下的ic_launcher.xml和 drawable 下的ic_launcher_background.xml、ic_launcher_foreground.xml。Image Asset 生成的ic_launcher.xml内容其实很简单?xml version1.0 encodingutf-8? adaptive-icon xmlns:androidhttp://schemas.android.com/apk/res/android background android:drawabledrawable/ic_launcher_background / foreground android:drawabledrawable/ic_launcher_foreground / /adaptive-icon这个 XML 引用两个 drawable 资源系统安装时把它和 mask 合成最终图标。2.2 手动创建 adaptive-icon.xml 并引用资源当你不满足于向导的生成或想手写结构时也不复杂。先准备好前景图和背景图放在res/drawable/下。然后在res/mipmap-anydpi-v26/注意一定是-v26目录里建ic_launcher.xml像上面那样引用资源即可。很多项目会为了兼容旧版本继续保留mipmap-*里的 PNG 图标。在 Android 8.0 及以上系统系统会自动去寻找mipmap-anydpi-v26/ic_launcher.xml低版本则使用旧PNG。这是有意的兼容设计不要删掉旧资源否则低版本设备会找不到图标。手动创建时还经常需要指定前景图的inset或scale。例如foreground android:drawabledrawable/ic_launcher_foreground /默认前景图是填满 108dp 的如果你的前景图本身设计时留白正确系统也能正常显示。但如果前景图是想覆盖在多张不同大小画布上需要开启向导的Trim功能裁剪空白边再把可缩放尺寸重新映射。Image Asset中的Trim选项会自动扫描透明边界但有时会裁掉你故意留下的视觉边距所以非必要不勾选。2.3 各机型与启动器下的呈现差异自适应图标在不同品牌 ROM 上的表现差异很大。原生 Android 提供的是圆形 mask三星 OneUI 默认是圆角方形小米 MIUI 给用户切换形状的权利华为部分版本早期甚至强行用了自己的兼容方案。系统 mask 不同同一套前景图在设备上裁切出来的边缘不同所以不必追求“每个手机上完全一样”只要核心图形在 66dp 安全区内边缘都不受损就够了。第三方桌面同样会改变图标行为。Nova Launcher 这类工具允许用户自定义图标形状甚至强制使用其他图标的 mask。第三方桌面通常读取的是应用图标本身如果它不支持自适应就可能显示成原来的方形或自适应以外的效果。这类问题不是你的配置错误而是桌面对 Adaptive Icon 支持程度不同。3. 关键参数与尺寸详解3.1 安全区域、视口与裁剪比例Adaptive Icon 的参数核心是 108dp 画布和 66dp 安全区这两个数字值得记住。系统会拿到 108x108dp 的背景和前景先分别缩放再用设备 mask 裁切。在白色背景下图标最外沿是 108dp 边界mask 裁切后实际可见区域可能只有 72dp x 72dp不同 mask 有所不同而 66dp 直径内的内容保证可见。之所以不是把安全区等同为可见区是因为系统还需要给图标周围留出一些余量用于视觉上的边缘效应以及系统自动缩放前景层时产生的位移。把关键内容放进 66dp是对所有设备最稳妥的保证。尺寸换算的公式很简单px dp * (density/160)。在 xxxhdpi密度 640上108dp 图标实际是 432x432px。如果你使用的是位图则需要在 xxhdpi 下准备 324x324pxxxxhdpi 下 432x432px。很多设计师第一次只给了一个 512x512在某些密度下图标就会糊。矢量资源则完全规避这个问题。3.2 文件位置与目录规则自适应图标放到mipmap而不能直接放在drawable的原因是历史惯例mipmap 目录会给系统启动器提供专门的密度资源优化避免图标被错误缩放。所以标准做法是在mipmap-anydpi-v26放ic_launcher.xml在drawable放实际前景和背景资源。mipmap-anydpi-v26中的anydpi表示任何密度通用v26限定 Android 8.0 及以上。这样兼容做法就成立低版本用mipmap-mdpi、mipmap-hdpi等目录里的旧图标高版本用 XML 关联的自适应图标。如果你在res下看到不符合这种结构的图标比如把ic_launcher_background.png直接放在mipmap中也能工作但不够规范。运营后台有些渠道要求上传特定尺寸图标时往往跟自适应图标没直接关系那是在应用商店用的不必跟系统图标混淆。3.3 动态主题与主题化图标适配Android 13API 33引入主题化图标Themed Icons又给这个过程加了一个monochrome图层。它本质上是另一张单色前景通常只包含图形轮廓系统会根据壁纸颜色实时给它上色。比如壁纸是蓝色系图标就统一变成蓝色剪影。配置方式是在adaptive-icon中加一句monochrome android:drawabledrawable/ic_launcher_monochrome /ic_launcher_monochrome可以是矢量图或位图仅使用黑白透明度信息。这一步强烈建议做因为它让桌面更统一也体现应用对系统新特性的尊重。做主题化图标时要保持线条简洁过于细的线条在单色渲染下会糊掉同时不要填充大面积黑色而是用透明背景白色图案。动态图标主题的实现基础也离不开这套结构。部分应用会在特定节日切换前景图或视觉元素通过更换前景资源或者调整背景纹理来实现。只要确保图片在安全区域内动态切换不会导致图标突兀。4. 实操中的常见问题与排查技巧4.1 为什么安装后图标背景显示成黑色或者透明背景层如果设置了透明内容而设备 mask 恰好是方形区域透明处就会露出桌面底色或者变成黑色。透明本身不是不行但绝大多数 Android 启动器底层是深色背景透明图标看起来像一块黑斑。这个现象最常见的原因是只画了一个透明PNG当前景忘记给背景层设置不透明色或图片。检查顺序先看ic_launcher.xml中 background 引用是否正确再看对应 drawable 是否真的是不透明。有时 Vector Drawable 里的fillColor带有透明度值比如#80FF0000表示红色 50% 透明肉眼看着深层很正常但放到底色后问题就暴露了。解决方式很简单背景图完全铺满不透明色或图片。还有一个容易忽略的点android:layer-list 里多个 item 重叠。如果你手动做了复杂背景注意最后一个 item 必须是真正想要的底色而不是渐变透明的叠加。4.2 前景和背景视觉错位像贴了一层贴纸当你的前景图没有居中或者背景图里有明显纹理方向时就会产生“贴纸感”。因为系统会针对前景层做轻微的位移以模拟视差所以如果前景和背景的相对位置本来就偏移动态效果会被放大。我的建议是在设计阶段把前景主图形锁定在画布中心背景不管用纹理还是渐变尽量围绕中心对称。实在需要使用非对称背景就放弃视差效果或者让前景图形稍微大一点让裁切后环境无法察觉背景偏移。Android Studio 自带预览功能在Image Asset界面右下角可以切换不同 mask 预览记得多切换几个形状看看。如果你在 XML 中手写引用也可以在 layout 中放置一个自定义 View 来模拟AdaptiveIconDrawable快速检查。4.3 图标安装后显得偏大或偏小前景图放得太大裁切后看起来充满整个 mask缺少边缘呼吸感放得太小又像一粒豆子浮在底色上。这个“偏大偏小”的感受其实来自安全区占比。例如你的前景主图形画在 108dp 画布的边界附近系统裁切时就会把一部分切掉视觉重心偏移如果主图形在 66dp 内但底色太亮又会让主图形显得没啥存在感。没有绝对数值但我建议主图形总高度不要超过 44dp~50dp大约占画布直径的 45% 左右。工具类应用图形简单40%~50%游戏或娱乐应用图形丰富可以略大但尽量控制在 50% 内。另外注意 Image Asset 的Resize滑杆不是让你控制安全区它是对整个前景图做缩放。如果你导入的素材本身主图形已经很小即使滑杆移到 100%主图形依然很小。这种情况需要先回到设计软件里把图形在画布上放大再导出来。4.4 主题化图标不生效或显示成原来的彩色图形主题化图标需要三个条件设备是 Android 13 或以上、桌面支持主题化、应用提供了monochrome图层。如果只满足前两个没有第三点系统只能回退到原本的彩色图标。所以不生效时先查应用是否提供了monochrome且adaptive-icon中是否正确引用。写monochrome时的一个常见错误是直接复制foreground资源但里面的fillColor是彩色系统虽然仍会用 alpha 识别形状但预览时常常能看到彩色残影。规范的monochrome应该用纯黑或纯白填充不要带任何彩色值。透明度可以用来控制某些区域的层级但建议所有可见区域都用完全不透明色。此外部分定制 ROM 把主题化图标入口藏得比较深需要用户手动打开。这个不算应用适配问题但可以提示用户检查系统设置中的主题图标开关。4.5 我在项目里最后留下的几点经验这套配置我至少折腾过几十个版本踩坑多了之后养成了两个习惯一是在设计稿里就把安全区标记出来用辅助线画一个直径 66dp 的圆所有核心元素都放在圆内避免进入开发阶段反复调参二是生成资源后立刻在 Android Studio 的Android Resource Manager里打开图标预览同时切几种 mask 形状看效果。另一个值得提的细节是ic_launcher_round.xml和ic_launcher.xml是两套资源。圆形图标通常用在系统设置或某些桌面如果你只改了一个另一个桌面可能仍显示旧图。所以在修改图标配置时别忘了同步更新ic_launcher_round.xml否则出现“应用图标换了个形”的半更新状态。这个内容后续还可以这样扩展如果你在用 Flutter 或 React Native 做一个跨平台应用流程实际上是一样的因为最终都要生成原生 Android 资源只是可能通过插件自动完成。我自己一般会用脚本把两张原始素材前景和背景分目录输出再生成adaptive-icon.xml这样团队里的设计同学迭代素材时只需要替换两张图打包流程不用动。多看几次 Image Asset 生成的产物你会发现这套机制比想象中好理解真正动手配一次后续再做图标调整就只需要十分钟了。
返回列表