自適應圖標在設備內保持一致的形狀,但因設備而異,開發人員僅提供一個圖標資產。此外,圖標支持兩層(前景和背景),可用於運動,為用戶提供視覺享受。
設備實現者提供了一個設備掩碼,它將決定設備上所有圖標的形狀。此圖標將用於任何使用啟動器圖標的系統 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%)。