实现自适应图标

如果开发者仅提供一个图标素材资源,自适应图标的形状在设备内会保持一致,但在设备之间会有所差异。此外,图标支持两个图层(前景和背景),可用于实现动画效果,从而为用户提供愉悦的视觉体验。

设备实现人员会提供一个设备遮罩,该遮罩将决定设备上所有图标的形状。该图标将在任何使用启动器图标(例如,启动器、概览、设置和分享表单)的系统界面上使用。

示例和源代码

代码示例:

  • 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 标准。Android 矢量可绘制对象也支持 PathData 的这种格式。

这个路径应该是上凸的,且应考虑视图边界范围内的安全区 (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();
    }

参考实现

无需执行任何操作,即可在任何系统界面上呈现静态自适应图标。当 PackageManager 返回可绘制对象时,只需将它绑定到 ImageView 即可。这就是图标在 Android O 之前版本的平台上呈现的方式。

关于如何呈现动态动画效果,Launcher3 (platform/packages/apps/Launcher3) 中会提供相应的参考实现来说明如何在 O-MR1 中实现这种效果。

验证

如需验证实现,请在替换其需要的遮罩后,查看图标是否可以在 Launcher3、设置、概览和设置中正确呈现。此外,您还可以在图形 CTS TestCase 中运行 AdaptiveIconDrawableTest.java 和 AdaptiveIconMaskTest.java 来测试实现。

可以在以下位置找到推荐的手动测试用例:platform/development/samples/AdaptiveIconSample/。

已知问题

已知问题包括:

  • 图标模糊(取决于遮罩路径的定义方式)。
  • 快捷方式图标被放大(如果应用开发者未使用 Icon.createWithAdaptiveBitmap() 方法或未正确使用此方法)。为使此方法正常发挥作用,如果图标是以位图形式传递的,则图标的四边应各保留 25% 的内边距。

这些问题可以通过以下方式解决:

  • 应在 [0,100] x [0,100] 坐标系中定义遮罩。
  • 确保用于自适应图标(启动器图标、快捷方式)的图片在四侧均保留了充足的内边距 (25%)。