以前和自适应图标(adaptive icon)打过交道,不过每次都是集中力气处理由它带来的问题,看过几次相关的资料,当时记住了,可时间一长,就又都漫漶在了记忆的不知何处去了。今天还是记录一下为好。
自适应图标是 Android O 引入的,也就是 Android 8(API level 是 26 的 Android 8.0 其 code name 是 O,而 API level 是 27 的 Android 8.1 也是)。
资源。为自适应图标做基础的资源类型也是相应新增的,叫做 AdaptiveIconDrawable。其定义形如:
|
1 2 3 4 |
[crayon-693061b5744e1905815046 inline="true" ]<adaptive-icon> <background android:drawable="@[drawable|mipmap|color]/bg_foo"/> <foreground android:drawable="@[drawable|mipmap|color]/fg_bar"/> </adaptive-icon> |
两个 drawable 的大小都必须是 108dp,背景 drawable 必须不透明,而前景 drawable 可以包含透明区域。
遮罩。需要说明的是,尽管自适应图标的大小是 108dp,但是最终显示/渲染一个自适应图标时,系统/设备/启动器所使用的施加于其上用以控制可见区域的遮罩,其大小却只能是 72dp。也就意味着,一个自适应图标的上下左右四个边,均有尺寸为 18dp 的部分在通常情况下是不可见的。
遮罩的形状必须是外凸(convex)的,其形状边缘至中心点的最小距离是 33dp。这也是下图中直径为 66dp 的所谓圆形“安全区”的由来。

渲染。从 Android 8 开始,截止到 Android 12 之前,如果创建图标时使用的是
createWithBitmap 方法,系统(此处主要是指 Google/Android 官方的行为)会对传统图标“以示尊重”,原样渲染,如果位图中存在透明区域,要么保持透明,要么可能渲染为某种特定的背景色(如黑色)。而从 Android 12 开始,系统决定不再给予传统图标那样的优惠待遇,使其长久地破坏系统的视觉效果一致性,于是决定将其缩小,并放置在白色的背景层之上。那会缩小到什么程度呢?就是可以完全放置在安全区以内的程度(可以参见旧文:Android 对非自适应图标的处理)。
Medium 上有人写的两篇博客,对于理解、应用、设计自适应图标具有参考价值。而且其中还提到了上文提及的被遮罩排除的那部分可以有什么样的利用价值。
- https://medium.com/androiddevelopers/implementing-adaptive-icons-1e4d1795470e
- https://medium.com/google-design/designing-adaptive-icons-515af294c783
Android 官方对 Icon 类的文档在:https://developer.android.com/reference/android/graphics/drawable/Icon。
