Explicăm esența Screen Density (Density Buckets) în Android — clasificarea ecranelor după densitatea pixelilor: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Screen Density determină câți pixeli fizici încap într-un țol de ecran și influențează direct modul în care imaginile și interfața sunt afișate pe diferite dispozitive. Conform Google Android Compatibility Definition (2025), Android suportă 6 Density Buckets principale și până la 8 suplimentare pentru dispozitive pliabile.
Principalele
Screen Density (densitatea ecranului) — este numărul de pixeli fizici pe un țol de ecran (ppi — pixels per inch, sau dpi — dots per inch). Android utilizează conceptul de Density Buckets — grupuri de ecrane cu densitate similară, pentru care se aplică aceiași factori de scalare. Spre deosebire de rezoluție (numărul de pixeli pe lățime și înălțime), densitatea determină dimensiunea fizică a pixelului pe ecran. Conform Google Pixel Team (2025), densitatea flagship-urilor moderne este de 450-550 ppi, ceea ce corespunde bucketelor xxhdpi-xxxhdpi.
Sistemul Density Buckets a apărut în Android 1.6 Donut (2009) cu primele dispozitive la 160 dpi (mdpi). Odată cu creșterea rezoluției ecranelor, au fost adăugate bucketuri noi: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4). Fiecare bucket nou reflecta o creștere de 1.5 ori sau dublă a densității față de precedentul. Conform Android Open Source Project (2025), în prezent 96% dintre dispozitivele Android active au densitatea de la hdpi la xxxhdpi.
Density Buckets — sunt intervalele de densitate definite de Google pentru gruparea ecranelor Android. Bucketul de bază — mdpi (160 dpi). Factorul de scară (scale factor) arată de câte ori resursa pentru un anumit bucket este mai mare decât pentru mdpi. De exemplu, xhdpi (2×) înseamnă că imaginea trebuie să fie de 2 ori mai mare în lățime și înălțime decât versiunea mdpi. Conform Android Studio Resource Manager (2025), xxhdpi este cel mai răspândit bucket printre dispozitivele active (38% din piață), urmat de xhdpi (28%).
| Bucket | Interval DPI | Scale | Dispozitiv exemplu | Cota de piață (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | Dispozitive vechi bugetare | Sub 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), tablete 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% |
Rezoluția ecranului — este numărul total de pixeli pe lățime și înălțime (de exemplu, 1080×2400). Densitatea ecranului — numărul de pixeli pe țol. Două dispozitive cu aceeași rezoluție pot avea densități diferite dacă dimensiunile fizice ale ecranului diferă. De exemplu, un telefon de 6 țoli cu rezoluția 1080×2400 are o densitate de aproximativ 440 dpi (xxhdpi), iar unul de 5 țoli cu aceeași rezoluție — aproximativ 530 dpi (xxxhdpi). Aceasta este diferența cheie: interfața trebuie să se adapteze nu la rezoluție, ci la densitate, altfel elementele vor fi prea mici pe dispozitivele cu densitate mare.
Android utilizează qualifiers în numele folderelor res pentru încărcarea resurselor pentru o densitate specifică a ecranului: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. La pornirea aplicației, Android selectează resursele din folderul care se potrivește cel mai bine cu densitatea dispozitivului. Dacă nu există o potrivire exactă, sistemul ia cel mai apropiat bucket sau scalează resursa dintr-o densitate mai mică. Conform Android Docs (2025), pentru vectori (VectorDrawable) calificatorii de densitate nu sunt necesari — se scalează automat.
/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)
În această structură, fiecare folder conține aceeași pictogramă, dar într-o dimensiune fizică diferită în pixeli. Dimensiunea de bază de 48×48 pixeli pentru mdpi se înmulțește cu factorul de scară pentru fiecare bucket. Android selectează automat fișierul necesar pe baza DisplayMetrics.density a dispozitivului. Pentru VectorDrawable (format XML) este suficient un singur fișier în drawable/ — sistemul îl scalează fără pierdere de calitate.
Calculul dimensiunii imaginii pentru fiecare densitate se bazează pe o formulă simplă: dimensiunea în mdpi × scale factor. Dacă pictograma în mdpi are dimensiunea 48×48 px, atunci pentru hdpi va fi 72×72 px (48 × 1.5), pentru xhdpi — 96×96 px (48 × 2), pentru xxhdpi — 144×144 px (48 × 3), pentru xxxhdpi — 192×192 px (48 × 4). Conform Material Design Guidelines (2025), această formulă se aplică pentru toate resursele raster: pictograme, fundaluri, imagini și 9-patch.
| Bucket | Scale | Dimensiune mdpi (px) | Dimensiune în 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 |
Pregătirea corectă a resurselor pentru Density Buckets include cinci reguli cheie. În primul rând, utilizați VectorDrawable pentru pictograme simple — aceasta elimină necesitatea a cinci copii. În al doilea rând, pentru imaginile raster, exportați toate densitățile simultan din instrumentele de design (Android Studio Asset Studio le generează automat). În al treilea rând, evitați plasarea imaginilor în drawable/ fără calificator — sistemul va scala cu pierdere de calitate. În al patrulea rând, testați pe un dispozitiv cu densitate diferită de cea principală — emulatorul permite schimbarea densității. În al cincilea rând, utilizați WebP în loc de PNG — conform Google (2025), WebP oferă o dimensiune cu 25-35% mai mică la aceeași calitate.
Întrebări frecvente
mdpi (medium-density pixel-independent) — este Density Bucketul de bază Android cu densitatea de 160 dpi. Toate celelalte bucketuri se calculează relativ la mdpi: hdpi — 1.5×, xhdpi — 2× și așa mai departe. mdpi corespunde unui pixel fizic per density-independent pixel (dp). Designerii se orientează exact după mdpi atunci când creează machete.
Utilizați DisplayMetrics: getResources().getDisplayMetrics().density returnează factorul de scară (1.0 pentru mdpi, 3.0 pentru xxhdpi). Pentru determinarea programatică a bucketului, apelați getResources().getConfiguration().densityDpi. În Android Studio există și Device Explorer, care arată densityDpi pentru dispozitivul conectat.
Tehnic — da, dar cu pierdere de calitate. Dacă resursa există doar în drawable-xxhdpi, pe un dispozitiv mdpi va fi micșorată de 3 ori — imaginea va deveni neclară. Dacă resursa este doar în mdpi, pe xxhdpi va fi mărită — va apărea pixelizarea. Se recomandă pregătirea cel puțin pentru xhdpi, xxhdpi și xxxhdpi — acoperă 84% din dispozitivele active (2025). Pentru VectorDrawable este suficient un singur fișier fără calificator.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și