自適應圖示在裝置內保持一致的形狀,但因裝置而異,開發人員僅提供一個圖示資源。此外,圖示支援兩層(前景和背景),可用於運動,為使用者提供視覺享受。
設備實現者提供了一個設備掩碼,它將決定設備上所有圖標的形狀。此圖示將用於任何使用啟動器圖示的系統 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 路徑定義標準。 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(); }
參考實現
無需執行任何操作即可在任何系統 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()
方法或未正確使用此方法,則會放大捷徑圖示。為了使此方法正常運行,傳入的位圖應在所有四個邊上填充 25%。
這些問題可以透過以下方式解決:
- 掩碼應在 [0, 100] x [0, 100] 座標系中定義。
- 確保用於自適應圖示(啟動器圖示、捷徑)的影像在所有四個側面都有足夠的填充 (25%)。