Ikony adaptacyjne zachowują spójny kształt na urządzeniu, ale różnią się w zależności od urządzenia i obejmują tylko jedną ikonę dostarczoną przez programistę. Dodatkowo ikony obsługują dwie warstwy (pierwszy plan i tło), których można używać do poruszania się, aby zapewnić użytkownikom przyjemność wizualną.
Osoby wdrażające urządzenia udostępniają maskę urządzenia, która decyduje o kształcie wszystkich ikon na urządzeniu. Ta ikona będzie używana na wszystkich powierzchniach interfejsu użytkownika systemu, które korzystają z ikon programu uruchamiającego (np. programie uruchamiającym, przeglądzie, ustawieniach i arkuszu udostępniania).
Przykłady i źródło
Przykłady kodu:
-
platform/development/samples/AdaptiveIconSample/
Dokumentacja deweloperska:
Kod źródłowy:
-
platform/frameworks/base/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
Realizacja
Aby zmienić kształt ikony na platformie, nałóż jeden ciąg znaków w framework/base/core/res/res/values/config.xml
w następujący sposób:
<!-- 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 są zgodne ze standardem W3, SVG dotyczącym definicji ścieżki . Ten format PathData jest również obsługiwany przez rysunki wektorowe w systemie Android.
Ścieżka ta powinna być wypukła i powinna respektować bezpieczną strefę (66/71 = 91%) w granicach widoku. Jest to egzekwowane w jednym z testów CTS.
Jeśli zdecydujesz się użyć koła jako maski platformy, pamiętaj o nałożeniu również config_useRoundIcon = true. Jeśli nie, ustaw tę wartość konfiguracyjną na false lub nie określaj tej wartości konfiguracyjnej.
Adaptacyjne API ikon
Poniżej przedstawiono 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 wyrenderować statyczne ikony adaptacyjne na dowolnej powierzchni interfejsu użytkownika systemu. Gdy PackageManager zwróci rysunek, po prostu powiąż go z ImageView. W ten sposób ikony są już renderowane na platformach Pre-O.
Jeśli chodzi o renderowanie efektu dynamicznego ruchu, Launcher3 (platforma/pakiety/aplikacje/Launcher3) będzie miał implementację referencyjną pokazującą, jak osiągnąć efekt w O-MR1.
Walidacja
Aby sprawdzić poprawność implementacji, po zastąpieniu maski upodobań sprawdź, czy ikony są poprawnie renderowane w Launcherze3, Ustawieniach, Przeglądzie i Ustawieniach. Możesz także uruchomić pliki AdaptiveIconDrawableTest.java i AdaptiveIconMaskTest.java wewnątrz grafiki CTS TestCase, aby przetestować implementację.
Zalecany ręczny przypadek testowy można znaleźć pod adresem: platform/development/samples/AdaptiveIconSample/.
Znane problemy
Znane problemy obejmują:
- Rozmazane ikony, w zależności od sposobu zdefiniowania ścieżki maski.
- Powiększone ikony skrótów, jeśli twórcy 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 być uzupełniona o 25% ze wszystkich czterech stron.
Problemy te można rozwiązać w następujący sposób:
- Maskę należy zdefiniować w układzie współrzędnych [0, 100] x [0, 100].
- Upewnij się, że obrazy używane w ikonach adaptacyjnych (ikony programu uruchamiającego, skróty) mają wystarczające wypełnienie (25%) ze wszystkich czterech stron.