如果开发者仅提供一个图标素材资源,自适应图标的形状在设备内会保持一致,但在设备之间会有所差异。此外,图标支持两个图层(前景和背景),可用于实现动画效果,从而为用户提供愉悦的视觉体验。
设备实现人员会提供一个设备遮罩,该遮罩将决定设备上所有图标的形状。该图标将在任何使用启动器图标(例如,启动器、概览、设置和分享表单)的系统界面上使用。
示例和源代码
代码示例:
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%)。