實現自適應圖標

自適應圖標在設備內保持一致的形狀,但因設備而異,開發人員僅提供一個圖標資產。此外,圖標支持兩層(前景和背景),可用於運動,為用戶提供視覺享受。

設備實現者提供了一個設備掩碼,它將決定設備上所有圖標的形狀。此圖標將用於任何使用啟動器圖標的系統 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、設置、概述和設置中正確呈現。您還可以在圖形 CTS TestCase 中運行 AdaptiveIconDrawableTest.java 和 AdaptiveIconMaskTest.java 來測試實現。

可以在以下位置找到推薦的手動測試用例:platform/development/samples/AdaptiveIconSample/。

已知的問題

已知問題包括:

  • 模糊圖標,取決於蒙版路徑的定義方式。
  • 如果應用程序開發人員不使用Icon.createWithAdaptiveBitmap()方法或未正確使用此方法,則放大快捷方式圖標。為了讓這個方法正常工作,傳入的 Bitmap 應該在所有四個邊上填充 25%。

這些問題可以解決如下:

  • 掩碼應在 [0, 100] x [0, 100] 坐標系中定義。
  • 確保用於自適應圖標(啟動器圖標、快捷方式)的圖像在所有四個側面都有足夠的填充 (25%)。