自适应图标可在设备内保持一致的形状,但因设备而异,开发者只需提供一个图标资源。此外,图标还支持两个图层(前景和背景),可用于动画效果,为用户带来视觉愉悦感。
设备实现者提供设备遮罩,该遮罩将决定设备上所有图标的形状。此图标将用于任何使用启动器图标的系统 UI 表面(例如,启动器、概览、设置和共享表)。
示例和源代码
代码示例
platform/development/samples/AdaptiveIconSample/
开发者文档
源代码
platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
实现
要更改平台上图标的形状,请在 framework/base/core/res/res/values/config.xml
中叠加一个字符串,如下所示:
<!-- Specifies the path that is used by AdaptiveIconDrawable class to crop launcher icons. --> <string name="config_icon_mask" translatable="false">"M50,0L100,0 100,100 0,100 0,0z"</string>
字符串的格式和语法遵循 W3, SVG 路径定义标准。PathData 的这种格式也是 Android 矢量可绘制对象所支持的格式。
此路径应为凸形,并且应在视图边界内遵守安全区(66/71 = 91%)。这在其中一项 CTS 测试中强制执行。
如果您决定使用圆形作为平台遮罩,请确保同时叠加 config_useRoundIcon = true。否则,请将此配置值设置为 false,或者不指定此配置值。
自适应图标 API
下面显示了 AdaptiveIconDrawable
类的 API:
package android.graphics.drawable; public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback { method public Drawable getBackground(); method public Drawable getForeground(); method public Path getIconMask(); method public Region getSafeZone(); method public float getExtraInsetFraction(); method public int getOpacity(); method public void invalidateDrawable(Drawable); method public void scheduleDrawable(Drawable, Runnable, long); method public void setAlpha(int); method public void setColorFilter(ColorFilter); method public void setOpacity(int); method public void unscheduleDrawable(android.graphics.drawable.Drawable, java.lang.Runnable); }
public class Icon extends Parceleable { method public Bitmap createWithAdaptiveBitmap(); }
参考实现
无需执行任何操作即可在任何系统 UI 表面上渲染静态自适应图标。当 PackageManager 返回可绘制对象时,只需将其绑定到 ImageView 即可。这就是在 Pre-O 平台上渲染图标的方式。
关于渲染动态动画效果,Launcher3 (platform/packages/apps/Launcher3) 将提供参考实现,展示如何在 O-MR1 中实现该效果。
验证
要验证实现,请在替换您喜欢的遮罩后,查看图标是否在 Launcher3、设置、概览和设置中正确渲染。您还可以运行 graphics CTS TestCase 中的 AdaptiveIconDrawableTest.java 和 AdaptiveIconMaskTest.java 来测试实现。
可在 platform/development/samples/AdaptiveIconSample/ 中找到推荐的手动测试用例。
已知问题
已知问题包括以下内容:
- 图标模糊,具体取决于遮罩路径的定义方式。
- 如果应用开发者未使用
Icon.createWithAdaptiveBitmap()
方法,或者未正确使用此方法,则快捷方式图标会放大。为了使此方法正常运行,传入的 Bitmap 应在所有四个边上填充 25%。
这些问题可以通过以下方式解决:
- 遮罩应在 [0, 100] x [0, 100] 坐标系中定义。
- 确保用于自适应图标(启动器图标、快捷方式)的图像在所有四个边上都有足够的填充(25%)。