Wyjaśniamy, czym jest Screen Density (Density Buckets) w Android — klasyfikacja ekranów według gęstości pikseli: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Screen Density określa, ile fizycznych pikseli mieści się w jednym calu ekranu i bezpośrednio wpływa na to, jak obrazy i interfejs są wyświetlane na różnych urządzeniach. Według Google Android Compatibility Definition (2025), Android obsługuje 6 głównych Density Buckets i do 8 dodatkowych dla urządzeń składanych.
Najważniejsze
Screen Density (gęstość ekranu) — to liczba fizycznych pikseli przypadających na jeden cal ekranu (ppi — pixels per inch, lub dpi — dots per inch). Android używa pojęcia Density Buckets — grup ekranów o podobnej gęstości, dla których stosowane są te same współczynniki skalowania. W przeciwieństwie do rozdzielczości (liczba pikseli w szerokości i wysokości), gęstość określa fizyczny rozmiar piksela na ekranie. Według Google Pixel Team (2025), gęstość nowoczesnych flagowców wynosi 450-550 ppi, co odpowiada bucketom xxhdpi-xxxhdpi.
System Density Buckets pojawił się w Android 1.6 Donut (2009) z pierwszymi urządzeniami o gęstości 160 dpi (mdpi). Wraz ze wzrostem rozdzielczości ekranów dodawano nowe buckety: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4). Każdy nowy bucket odzwierciedlał półtorakrotny lub dwukrotny wzrost gęstości względem poprzedniego. Według Android Open Source Project (2025), obecnie 96% aktywnych urządzeń Android ma gęstość od hdpi do xxxhdpi.
Density Buckets — to zakresy gęstości określone przez Google do grupowania ekranów Android. Podstawowy bucket — mdpi (160 dpi). Współczynnik skalowania (scale factor) pokazuje, ile razy zasób dla danego bucketa jest większy niż dla mdpi. Na przykład xhdpi (2×) oznacza, że obraz powinien być 2 razy większy pod względem szerokości i wysokości niż jego wersja mdpi. Według Android Studio Resource Manager (2025), xxhdpi jest najczęściej spotykanym bucketem wśród aktywnych urządzeń (38% rynku), a za nim xhdpi (28%).
| Bucket | Zakres DPI | Scale | Przykładowe urządzenie | Udział w rynku (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | Stare budżetowe urządzenia | Poniżej 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), tablety 7″ | 3% |
| hdpi | 160-240 dpi | 1.5× | Samsung Galaxy S2, Nexus 4 | 12% |
| xhdpi | 240-320 dpi | 2× | Google Nexus 5, Moto G | 28% |
| xxhdpi | 320-480 dpi | 3× | Samsung Galaxy S8, Pixel 3 | 38% |
| xxxhdpi | 480-640 dpi | 4× | Samsung Galaxy S24 Ultra, Pixel 9 Pro | 18% |
Rozdzielczość ekranu — to całkowita liczba pikseli w szerokości i wysokości (np. 1080×2400). Gęstość ekranu — liczba pikseli na cal. Dwa urządzenia z tą samą rozdzielczością mogą mieć różną gęstość, jeśli różnią się fizycznymi rozmiarami ekranu. Na przykład 6-calowy telefon z rozdzielczością 1080×2400 ma gęstość około 440 dpi (xxhdpi), a 5-calowy z tą samą rozdzielczością — około 530 dpi (xxxhdpi). To kluczowa różnica: interfejs powinien dostosowywać się nie do rozdzielczości, ale do gęstości, w przeciwnym razie elementy będą zbyt małe na urządzeniach o wysokiej gęstości.
Android używa qualifiers w nazwach folderów res do ładowania zasobów dla konkretnej gęstości ekranu: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. Podczas uruchamiania aplikacji Android wybiera zasoby z folderu najlepiej dopasowanego do gęstości urządzenia. Jeśli nie ma dokładnego dopasowania, system bierze najbliższy bucket lub skaluje zasób z niższej gęstości. Według Android Docs (2025), dla wektorów (VectorDrawable) kwalifikatory gęstości nie są potrzebne — skalują się automatycznie.
/res/
drawable-mdpi/
icon_app.png (48x48 px)
drawable-hdpi/
icon_app.png (72x72 px)
drawable-xhdpi/
icon_app.png (96x96 px)
drawable-xxhdpi/
icon_app.png (144x144 px)
drawable-xxxhdpi/
icon_app.png (192x192 px)
W tej strukturze każdy folder zawiera tę samą ikonę, ale w innym fizycznym rozmiarze w pikselach. Podstawowy rozmiar 48×48 pikseli dla mdpi jest mnożony przez scale factor dla każdego bucketa. Android automatycznie wybiera odpowiedni plik na podstawie DisplayMetrics.density urządzenia. Dla VectorDrawable (format XML) wystarczy jeden plik w drawable/ — system skaluje go bez utraty jakości.
Obliczanie rozmiaru obrazu dla każdej gęstości opiera się na prostym wzorze: rozmiar w mdpi × scale factor. Jeśli ikona w mdpi ma rozmiar 48×48 px, to dla hdpi będzie to 72×72 px (48 × 1.5), dla xhdpi — 96×96 px (48 × 2), dla xxhdpi — 144×144 px (48 × 3), dla xxxhdpi — 192×192 px (48 × 4). Według Material Design Guidelines (2025), ten wzór jest stosowany dla wszystkich zasobów rastrowych: ikon, tła, obrazów i 9-patch.
| Bucket | Scale | Rozmiar mdpi (px) | Rozmiar w bucket (px) |
|---|---|---|---|
| mdpi | 1× | 48×48 | 48×48 |
| hdpi | 1.5× | 48×48 | 72×72 |
| xhdpi | 2× | 48×48 | 96×96 |
| xxhdpi | 3× | 48×48 | 144×144 |
| xxxhdpi | 4× | 48×48 | 192×192 |
Prawidłowe przygotowanie zasobów dla Density Buckets obejmuje pięć kluczowych zasad. Po pierwsze, używaj VectorDrawable dla prostych ikon — eliminuje to potrzebę pięciu kopii. Po drugie, dla obrazów rastrowych eksportuj z narzędzi projektowych wszystkie gęstości jednocześnie (Android Studio Asset Studio generuje automatycznie). Po trzecie, unikaj umieszczania obrazów w drawable/ bez kwalifikatora — system będzie skalował z utratą jakości. Po czwarte, testuj na urządzeniu o gęstości różnej od twojego podstawowego — emulator pozwala zmieniać gęstość. Po piąte, używaj WebP zamiast PNG — według Google (2025), WebP daje o 25-35% mniejszy rozmiar przy tej samej jakości.
Często zadawane pytania
mdpi (medium-density pixel-independent) — podstawowy Density Bucket Android o gęstości 160 dpi. Wszystkie pozostałe buckety są obliczane względem mdpi: hdpi — 1.5×, xhdpi — 2× i tak dalej. mdpi odpowiada jednemu fizycznemu pikselowi na jeden density-independent pixel (dp). To na mdpi orientują się projektanci przy tworzeniu makiet.
Użyj DisplayMetrics: getResources().getDisplayMetrics().density zwraca scale factor (1.0 dla mdpi, 3.0 dla xxhdpi). Do programowego określenia bucketa wywołaj getResources().getConfiguration().densityDpi. W Android Studio dostępny jest również Device Explorer, pokazujący densityDpi dla podłączonego urządzenia.
Technicznie — tak, ale z utratą jakości. Jeśli zasób jest tylko w drawable-xxhdpi, na urządzeniu mdpi zostanie zmniejszony 3 razy — obraz stanie się rozmyty. Jeśli zasób jest tylko w mdpi, na xxhdpi zostanie powiększony — pojawi się pikselizacja. Zaleca się przygotowanie co najmniej dla xhdpi, xxhdpi i xxxhdpi — to pokrywa 84% aktywnych urządzeń (2025). Dla VectorDrawable wystarczy jeden plik bez kwalifikatora.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również