Ikony adaptacyjne mają ten sam kształt na wszystkich urządzeniach, ale różnią się na poszczególnych urządzeniach. Deweloperzy muszą przesłać tylko 1 zasób ikony. Ikony mogą też mieć 2 warstwy (pierwszego planu i tła), które można wykorzystać do animacji, aby zapewnić użytkownikom przyjemne wrażenia wizualne.
Implementatorzy urządzeń udostępniają maskę urządzenia, która określa kształt wszystkich ikon na urządzeniu. Ta ikona będzie używana na wszystkich interfejsach systemu, które korzystają z ikon programów uruchamiających (np. na ekranie uruchamiania, stronie przeglądu, w ustawieniach i na karcie udostępniania).
Przykłady i źródło
Przykłady kodu:
platform/development/samples/AdaptiveIconSample/
Dokumentacja dla deweloperów:
Kod źródłowy:
platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
Implementacja
Aby zmienić kształt ikony na platformie, nałóż jeden ciąg znaków w, w ten sposób: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>
Format i składnia ciągu znaków są zgodne ze standardem W3, SVG, dotyczącym definicji ścieżek. Ten format danych ścieżki jest również obsługiwany przez wektory rysunków na Androidzie.
Ścieżka powinna być wypukła i powinna uwzględniać bezpieczną strefę (66/71 = 91%) w granicach widoku. Jest to wymuszane w ramach jednego z testów CTS.
Jeśli zdecydujesz się użyć koła jako maski platformy, musisz też użyć overlay config_useRoundIcon = true. W przeciwnym razie ustaw tę wartość konfiguracji na „false” (fałsz) lub nie podawaj jej wcale.
Interfejs Adaptive Icon API
Interfejs API klasy AdaptiveIconDrawable
:
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(); }
Implementacja referencyjna
Nie trzeba nic robić, aby renderować statyczne ikony adaptacyjne na dowolnej z powierzchni interfejsu użytkownika systemu. Gdy PackageManager zwróci obiekt drawable, po prostu powiązać go z ImageView. Ikony są już renderowane na platformach w wersji wczesnej.
Jeśli chodzi o renderowanie efektu dynamicznego ruchu, komponent Launcher3 (platform/packages/apps/Launcher3) będzie miał implementację referencyjną pokazującą, jak uzyskać ten efekt w wersji O-MR1.
Weryfikacja
Aby sprawdzić implementację, po zastąpieniu maski, która im się podoba, sprawdź, czy ikony są prawidłowo renderowane w Launcher3, Ustawieniach i Przeglądzie. Aby przetestować implementację, możesz też uruchomić AdaptiveIconDrawableTest.java i AdaptiveIconMaskTest.java w ramach testu CTS obrazu graficznego.
Zalecane ręczne testowanie znajdziesz na stronie: platform/development/samples/AdaptiveIconSample/.
Znane problemy
Znane problemy:
- niewyraźne ikony, w zależności od sposobu zdefiniowania ścieżki maski.
- Zbliżone ikony skrótów, jeśli deweloperzy aplikacji nie używają metody
Icon.createWithAdaptiveBitmap()
lub nie używają jej prawidłowo. Aby ta metoda działała prawidłowo, przekazana bitmapa powinna mieć 25% marginesu ze wszystkich 4 stron.
Te problemy można rozwiązać w ten sposób:
- Maska powinna być zdefiniowana w układzie współrzędnych [0, 100] x [0, 100].
- Upewnij się, że obrazy używane jako ikony adaptacyjne (ikony programu uruchamiającego, skróty) mają wystarczającą ilość miejsca (25%) po wszystkich 4 stronach.