实现自适应图标

自适应图标可在设备内保持一致的形状,但因设备而异,开发者只需提供一个图标资源。此外,图标还支持两个图层(前景和背景),可用于动画效果,为用户带来视觉愉悦感。

设备实现者提供设备遮罩,该遮罩将决定设备上所有图标的形状。此图标将用于任何使用启动器图标的系统 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%)。