Parametry ikon w aplikacjach Android
Opis ogólny
Od Androida 8.0 (API 26) obowiązuje standard ikon adaptacyjnych (Adaptive Icons). Ich celem jest zapewnienie spójnego wyglądu pulpitu niezależnie od tego, jakiego motywu używa producent telefonu (np. ikony okrągłe w czystym Androidzie, zaokrąglone kwadraty w Samsungu czy tzw. "squircle" w Xiaomi). Same grafiki wektorowe były używane już w starszych Androidach od wersji 5.0 (API 21), słuzyły one wyświetlania obrazów w samej aplikacji, a nie jako ikony. Ikony monochromatyczne (jednokolorowe) to rozszerzenie standardu ikon adaptacyjnych, które pozwala dostosować wygląd pulpitu do palety kolorystycznej systemu (np. technologii Material You / Dynamic Color). Zostały wprowadzone od wersji Android 13 (API level 33).W przypadku ikon w formacie XML (wektorowych) nie ma ograniczeń co do rozdzielczości, w zasadzie może być dowolna, gdyż są skalowalne i zachowują ostrość niezależnie od skali. Wystarczy podać jeden plik w formacie XML, a system Android sam dopasuje go do rozdzielczości ekranu. Warto jednak pamiętać, że niektóre starsze wersje Androida mogą nie obsługiwać ikon wektorowych, dlatego zaleca się dostarczenie również ikon w formacie PNG dla kompatybilności wstecznej.
Zazwyczaj spotykanym formatem wektorowym jest SVG, który można przekonwertować do formatu XML przy użyciu narzędzi takich jak Android Studio lub online konwerterów. Warto również pamiętać, że ikony wektorowe mogą być bardziej złożone i zawierać więcej szczegółów, co może wpływać na wydajność renderowania w aplikacji, zwłaszcza na starszych urządzeniach.
Marginesy
W przypadku ikon adaptacyjnych, zaleca się pozostawienie marginesu wokół ikony, aby uniknąć przycinania jej przez system. Standardowo zaleca się pozostawienie marginesu wynoszącego 20% szerokości i wysokości ikony. Bezpieczna strefa (Safe Zone): Kluczowy element graficzny (logo/sygnet) musi znajdować się w centralnym okręgu o średnicy 66 dp (lub kwadracie 72 x 72 dp). Wszystko, co wykracza poza ten obszar, może zostać przycięte przez maskę systemową.W praktyce:
- ikony rastrowe (PNG) wystarczy zostawić minimalny odstęp od krawędzi, np. 2-4 px, aby uniknąć przycinania na różnych urządzeniach i wersjach Androida. Musimy się jednak liczyc, że nakładki systemowe producentów telefonów mogą przycinać ikony w różny sposób, dlatego istotne elementy graficzne powinny być umieszczone w centralnej części ikony, a nie przy krawędziach.
- ikony wektorowe (XML) minimalne marginesy od krawędzi obszaru roboczego powinny wynosić około 25px przy wymiarze 108x108px.
Baner (dla wersji TV)
W przypadku aplikacji przeznaczonych na Android TV (Google TV, ewentualnie FireOS), zaleca się dostarczenie dodatkowego obrazu banera (banner) w formacie PNG o wymiarach 320x180 px. Baner ten jest wyświetlany w interfejsie Android TV i powinien być spójny wizualnie z ikoną aplikacji, ale może zawierać więcej szczegółów lub informacji, które nie mieszczą się w standardowej ikonie. Baner powinien być zoptymalizowany pod kątem wyświetlania na dużych ekranach, z odpowiednim kontrastem i czytelnością tekstu, jeśli jest on używany. Zazwyczaj narożniki są zaokrąglone, a kluczowe elementy graficzne powinny być umieszczone w centralnej części obrazu, aby uniknąć przycinania na różnych urządzeniach i wersjach Android TV.Ikony werktorowe - warstwy
Ikony wektorowe (XML) mogą składać się z dwóch warstw: tło (background) i pierwszoplanowej (foreground).- Warstwa tła – może być jednolita lub zawierać gradient (albo wzór obrazka), musi w pełni pokrywać cały obszar (108 x 108 dp). Nie stosuje się tu przezroczystości (brak kanału Alpha na brzegach), chyba że tło jest zdefiniowane jako prosty kolor w kodzie XML (<color>).
-
Warstwa pierwszoplanowa – zawiera kluczowy element graficzny, który jest wyświetlany na wierzchu. System Android automatycznie nakłada maskę na ikonę, aby dopasować ją do kształtu wybranego przez użytkownika (okrąg, kwadrat, squircle). W przypadku ikon wektorowych, zaleca się również stosowanie prostych kształtów i ograniczenie liczby szczegółów, aby zapewnić czytelność ikony w różnych rozmiarach.
W obszarze wokół logo lub pod elementami grafiki tło musi być całkowicie przezroczyste (kanał Alpha = 0%). - Obie warstwy (zarówno plik tła, jak i plik logo) muszą posiadać identyczny wymiar (density-independent pixels).
Ikony monochromatyczne
Kiedy Użytkownik w ustawieniach telefonu włącza opcję „Ikony z motywem”. W tym momencie system ignoruje kolorowe tło i kolorowe logo z Twojej ikony adaptacyjnej, a sięga po trzecią, opcjonalną warstwę: monochromatyczną (<monochrome>). System sam nakłada na tę warstwę dwa kolory pobrane z tapety użytkownika: kolor tła kafelka oraz kolor sygnetu/logo. Parametry:- Grafika nie może zawierać gradientów, cieni (drop shadows), tekstur ani wielu kolorów.
- Wszystkie ścieżki (<path>) w pliku XML powinny używać jednego, czystego koloru (standardowo czarnego #000000 lub białego #FFFFFF). System i tak podmieni ten kolor na barwę z motywu użytkownika.
- Przezroczystość służy do wycinania kształtów wewnątrz logo (np. litera „O” ma dziurę w środku).
- Możesz używać półprzezroczystości (np. Alpha 50%), jeśli chcesz uzyskać efekt odcienia tego samego koloru, ale zaleca się używanie pełnego krycia dla czytelności.
Ikony regionalne
W przypadku aplikacji wielojęzycznych, zaleca się dostarczenie ikon w różnych wariantach językowych, aby zapewnić spójność wizualną i czytelność. System Android automatycznie wybiera odpowiednią ikonę w zależności od ustawień językowych urządzenia. W praktyce oznacza to, że dla każdej lokalizacji (np. polski, angielski, niemiecki) można przygotować osobne pliki ikon, które będą zawierały odpowiednie napisy lub symbole charakterystyczne dla danego języka. Warto również pamiętać, że niektóre elementy graficzne mogą być uniwersalne i nie wymagać lokalizacji, co pozwala na zmniejszenie liczby plików ikon w projekcie aplikacji.Ikony ic_launcher_round
(zaokrąglone narożniki)
- Ikony rastrowe. Wprowadzone w Androidzie 7.1 Nougat (API 25) dla telefonów z serii Google Pixel. Był to tymczasowy krok Google na zapewnienie wymuszonego, spójnego okrągłego wyglądu ikon na pulpicie, zanim powstał nowoczesny standard. Aktualnie nie ma potrzeby ich stosowania, gdyż system sam nakłada maskę na ikonę adaptacyjną, dopasowując ją do kształtu wybranego przez użytkownika (okrąg, kwadrat, squircle). Warto jednak pamiętać, że niektóre starsze wersje Androida mogą wymagać dostarczenia osobnego pliku ikony zaokrąglonej, aby zapewnić kompatybilność wsteczną. Jeśli musisz użyć rastra zapasowego (Legacy PNG), wzorcowy wymiar to 192 × 192 px (dla gęstości xxhdpi) lub 144 × 144 px (dla xhdpi). Nie twórz osobnych plików PNG dla każdej rozdzielczości (ldpi, mdpi, hdpi...): To przestarzały rozwiązanie i niepotrzebny bałagan w kodzie. Od Androida 8.0 (API 26+) nie wycina się kształtów na stałe w plikach PNG.
-
Ikony wektorowe. Aktualnie używa się ikony adaptacyjnej w formacie wektorowym XML
(
mipmap-anydpi-v26), a system sam nakłada odpowiednią maskę (koło, squircle, zaokrąglony kwadrat).
Obecność plikuic_launcher_round.xmlwmipmap-anydpi-v26to wyłącznie wymóg formalny dla kompilatora i starych mechanizmów systemu. Jeśli wAndroidManifest.xmlodwołasz się do@mipmap/ic_launcher_round, system podczas budowania aplikacji oczekuje, że znajdzie zasób o takiej nazwie w każdej obsługiwanej kategorii gęstości, w tym wmipmap-anydpi-v26. Dochodzi kwestia wstecznej kompatybilności: urządzenia z Androidem 7.1 (API 25), które były w trakcie aktualizacji do Androida 8.0, szukały wskaźnikaroundIcon. Umieszczenie pliku XML o nazwieic_launcher_round.xmlzapobiega błędom braku zasobu (Resource Not Found). Zatem: czy plikic_launcher_round.xmlpowinien istnieć w mipmap-anydpi-v26? TAK, ale jako duplikat. Jest to po prostu kopia plikuic_launcher.xml, zazwyczaj wygenerowana automatycznie przez Image Asset Studio, aby proces kompilacji przebiegł bezbłędnie.
Ikony - nieaktualne praktyki
W historii rozwoju Androida nagromadziło się wiele rozwiązań graficznych, które dziś stanowią jedynie zaszłość historyczną i archaizm technologiczny. Przede wszystkim całkowicie porzucono ręczne przygotowywanie zestawów rastrowych plików PNG dla niskozagęszczonych ekranów, takich jak LDPI, MDPI czy eksperymentalne TVDPI, które projektowano z myślą o dawnych tabletach i pierwszych generacjach przystawek. Nie używa się już także niestandardowych, wymyślanych na własną rękę katalogów w stylu mipmap-television, ponieważ współczesny system operacyjny szuka zasobów według ściśle określonych, oficjalnych kwalifikatorów gęstości oraz flag w manifeście. Do lamusa przeszło również ręczne wycinanie na stałe okrągłych krawędzi w plikach graficznych na potrzeby atrybutu roundIcon, co było jedynie krótkotrwałym rozwiązaniem pomostowym z czasów Androida 7.1. Podobnie archaiczne stało się projektowanie statycznych, jednowarstwowych ikon launcherowych, w których tło i sygnet stanowiły jeden niepodzielny obrazek, co uniemożliwia dzisiejszym systemom stosowanie efektów paralaksy czy automatycznego maskowania. Co ciekawe, w pierwszych wersjach Androida brak elastyczności graficznej zmuszał deweloperów do tworzenia nawet kilkunastu wariantów tej samej ikony pod każdy możliwy ekran, podczas gdy dziś cały ten skomplikowany ekosystem zastępuje się w zasadzie kilkoma uniwersalnymi plikami wektorowymi XML oraz jednym banerem TV.Lokalizacja ikon
Lokalizację określamy w pliku AndroidManifest.xml w sekcji <application> poprzez atrybut android:icon.
Można wskazać różne pliki ikon dla różnych języków, używając odpowiednich folderów zasobów (np. res/drawable-pl/ dla polskiego, res/drawable-en/ dla angielskiego). System Android automatycznie wybiera odpowiednią ikonę w zależności od ustawień językowych urządzenia.
Plik AndroidManifest.xml
znajduje się w:
app/src/main/AndroidManifest.xml.
<!-- Flaga informująca, że aplikacja jest przeznaczona na TV -->
<uses-feature
android:name="android.software.leanback"
android:required="false" />
<application
android:icon="@mipmap/ic_launcher"
android:banner="@drawable/tv_banner" <!-- Tu wskazujesz swój baner 16:9 -->
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round">
<!-- Możesz przekierować do standardowej ikony "ic_launcher" -->
<activity
android:name=".MainActivity"
android:exported="true"
android:banner="@drawable/tv_banner"> <!-- Bezpiecznie powtórzyć w głównej aktywności -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<!-- Kategoria launcherowa dla ekranu głównego TV -->
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
<!-- Kategoria launcherowa dla telefonów/tabletow -->
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<application>
Lokalizacje plików graficznych:
\app\src\main\res\mipmap-anydpi-v26\ic_launcher_round.xml
\app\src\main\res\mipmap-anydpi-v26\ic_launcher.xml
\app\src\main\res\mipmap-hdpi\ic_launcher.png
\app\src\main\res\mipmap-ldpi\ic_launcher.png
\app\src\main\res\mipmap-mdpi\ic_launcher.png
\app\src\main\res\mipmap-xhdpi\ic_launcher_round.png
\app\src\main\res\mipmap-xhdpi\ic_launcher.png
\app\src\main\res\mipmap-xxhdpi\ic_launcher_round.png
\app\src\main\res\mipmap-xxhdpi\ic_launcher.png
\app\src\main\res\mipmap-xxxhdpi\ic_launcher.png
\app\src\main\res\drawable\tv_banner.png
Plik:
-
ic_launcher(png, xml) w poszczególnych folderach odpowiadają różnym gęstościom ekranów (ldpi, mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi oraz wektor). -
ic_launcher_round(png, xml) jest używany w przypadku, gdy system wymaga okrągłej ikony -
tv_banner(png) jest używany jako baner dla aplikacji na Android TV.
System sam wybiera odpowiedni plik, ważne aby był wrzucony do zdeklarowanego folderu, jak widać powyżej
mipmap
lub dla AndroidTV drawable
.
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@drawable/ic_launcher_background" />
<foreground android:drawable="@drawable/ic_launcher_foreground" />
<monochrome android:drawable="@drawable/ic_launcher_monochrome" />
</adaptive-icon>
Inaczej mówiąc, tak powinien wyglądać kod pliku ic_launcher.xml (analogicznie tworzymy ic_launcher_round.xml).
Jak widać powyżej w tym przypadku poszczególne składniki ikony (tło, logo, warstwa monochromatyczna) są zdefiniowane w osobnych plikach graficznych i umieszczone w katalogu
drawable.
Podsumowanie:
- Parametry:
ldpi (low density) – 36x36 px
mdpi (medium density) – 48x48 px
hdpi (high density) – 72x72 px
xhdpi (extra high density) – 96x96 px
xxhdpi (extra extra high density) – 144x144 px
xxxhdpi (extra extra extra high density) – 192x192 px
xml (vector) - domyślnie 108x108 px
tv-banner (TV density) – 320x180 px - Tworzenie ikon dla Androida opiera się na spójności, rozdzieleniu warstw oraz właściwym deklarowaniu zasobów w manifeście aplikacji
- Współczesny standard (Android 8.0+ / API 26+): Podstawą na smartfonach jest ikona adaptacyjna (Vector XML w mipmap-anydpi-v26), składająca się z osobnego tła i logo w strefie bezpiecznej (Safe Zone 66 dp). System sam nakłada na nią odpowiednią maskę (koło, squircle, zaokrąglony kwadrat), a od Androida 13 pozwala na dodanie warstwy monochromatycznej (<monochrome>)
-
Telewizory i przystawki (Android TV, Google TV, Fire OS): Wymagają prostokątnego banera 16:9 (tv_banner.png 320×180 px w drawable-xhdpi) zdeklarowanego jako android:banner w manifeście, obok kwadratowej ikony
android:icon - Przeżytki i dobre praktyki: Nie tworzy się już osobnych plików PNG dla starych rozdzielczości (np. ldpi, mdpi, tvdpi), a atrybut android:roundIcon w manifeście można odesłać do tego samego pliku co android:icon. Lokalizację grafiki z tekstem wykonuje się poprzez kwalifikatory katalogów (np. drawable-pl), jednak najlepszą praktyką jest stosowanie sygnetu bez tekstów.
