Spieghiamo l'essenza di Screen Density (Density Buckets) in Android — la classificazione degli schermi per densità di pixel: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Screen Density determina quanti pixel fisici ci stanno in un pollice di schermo e influenza direttamente come immagini e interfaccia vengono visualizzate su diversi dispositivi. Secondo Google Android Compatibility Definition (2025), Android supporta 6 Density Buckets principali e fino a 8 aggiuntivi per dispositivi pieghevoli.
Punti chiave
Screen Density è il numero di pixel fisici per pollice di schermo (ppi — pixel per pollice, o dpi — punti per pollice). Android utilizza il concetto di Density Buckets — gruppi di schermi con densità simile che usano gli stessi fattori di scala. A differenza della risoluzione (numero di pixel in larghezza e altezza), la densità determina la dimensione fisica di un pixel sullo schermo. Secondo Google Pixel Team (2025), la densità dei flagship moderni è di 450-550 ppi, che corrisponde al bucket xxhdpi-xxxhdpi.
Il sistema di Density Buckets è apparso in Android 1.6 Donut (2009) con i primi dispositivi a 160 dpi (mdpi). Con l'aumento delle risoluzioni dello schermo, sono stati aggiunti nuovi bucket: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4). Ogni nuovo bucket rifletteva un aumento di densità di 1.5× o 2× rispetto al precedente. Secondo Android Open Source Project (2025), il 96% dei dispositivi Android attivi ora ha densità che vanno da hdpi a xxxhdpi.
Density Buckets sono intervalli di densità definiti da Google per raggruppare gli schermi Android. Il bucket base è mdpi (160 dpi). Il fattore di scala mostra quante volte più grande è una risorsa per un dato bucket rispetto a mdpi. Ad esempio, xhdpi (2×) significa che l'immagine deve essere 2 volte più grande in larghezza e altezza rispetto alla sua versione mdpi. Secondo Android Studio Resource Manager (2025), xxhdpi è il bucket più comune tra i dispositivi attivi (38% di quota di mercato), seguito da xhdpi (28%).
| Bucket | Intervallo DPI | Scala | Esempio di dispositivo | Quota di mercato (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | Vecchi dispositivi economici | Meno dell'1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), tablet 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% |
La risoluzione dello schermo è il numero totale di pixel in larghezza e altezza (es. 1080×2400). La densità dello schermo è il numero di pixel per pollice. Due dispositivi con la stessa risoluzione possono avere densità diverse se le loro dimensioni fisiche dello schermo differiscono. Ad esempio, un telefono da 6 pollici con risoluzione 1080×2400 ha una densità di circa 440 dpi (xxhdpi), mentre un telefono da 5 pollici con la stessa risoluzione ha circa 530 dpi (xxxhdpi). Questa è una differenza fondamentale: l'interfaccia deve adattarsi non alla risoluzione ma alla densità, altrimenti gli elementi saranno troppo piccoli sui dispositivi ad alta densità.
Android utilizza qualificatori nei nomi delle cartelle res per caricare risorse per una specifica densità dello schermo: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. All'avvio dell'applicazione, Android seleziona le risorse dalla cartella che meglio corrisponde alla densità del dispositivo. Se non c'è una corrispondenza esatta, il sistema utilizza il bucket più vicino o scala una risorsa da una densità inferiore. Secondo Android Docs (2025), i qualificatori di densità non sono necessari per i vettori (VectorDrawable) — vengono scalati automaticamente.
/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)
In questa struttura, ogni cartella contiene la stessa icona ma in una diversa dimensione fisica in pixel. La dimensione base di 48×48 pixel per mdpi viene moltiplicata per il fattore di scala di ogni bucket. Android seleziona automaticamente il file corretto in base a DisplayMetrics.density del dispositivo. Per VectorDrawable (formato XML), un singolo file in drawable/ è sufficiente — il sistema lo scala senza perdita di qualità.
Il calcolo della dimensione di un'immagine per ogni densità si basa su una formula semplice: dimensione in mdpi × fattore di scala. Se un'icona in mdpi è 48×48 px, per hdpi sarà 72×72 px (48 × 1.5), per xhdpi — 96×96 px (48 × 2), per xxhdpi — 144×144 px (48 × 3), per xxxhdpi — 192×192 px (48 × 4). Secondo le Material Design Guidelines (2025), questa formula si applica a tutte le risorse raster: icone, sfondi, immagini e 9-patch.
| Bucket | Scala | Dimensione mdpi (px) | Dimensione nel 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 |
La corretta preparazione delle risorse per Density Buckets include cinque regole chiave. Primo, usa VectorDrawable per icone semplici — questo elimina la necessità di cinque copie. Secondo, per immagini raster, esporta tutte le densità dagli strumenti di progettazione (Android Studio Asset Studio le genera automaticamente). Terzo, evita di mettere immagini in drawable/ senza qualificatore — il sistema le scalerà con perdita di qualità. Quarto, testa su un dispositivo con densità diversa dal tuo principale — l'emulatore permette di cambiare la densità. Quinto, usa WebP invece di PNG — secondo Google (2025), WebP offre una dimensione del 25-35% inferiore a parità di qualità.
Domande frequenti
mdpi (medium-density pixel-independent) — il bucket di densità base in Android con una densità di 160 dpi. Tutti gli altri bucket sono calcolati relativamente a mdpi: hdpi — 1.5×, xhdpi — 2× e così via. mdpi corrisponde a un pixel fisico per pixel indipendente dalla densità (dp). I designer usano mdpi come riferimento durante la creazione dei layout.
Usa DisplayMetrics: getResources().getDisplayMetrics().density restituisce il fattore di scala (1.0 per mdpi, 3.0 per xxhdpi). Per determinare programmaticamente il bucket, chiama getResources().getConfiguration().densityDpi. Android Studio ha anche un Device Explorer che mostra densityDpi per i dispositivi connessi.
Tecnicamente — sì, ma con perdita di qualità. Se una risorsa è disponibile solo in drawable-xxhdpi, su un dispositivo mdpi verrà ridotta di 3× — l'immagine diventerà sfocata. Se la risorsa è solo in mdpi, su xxhdpi verrà ingrandita — pixelizzazione. Si raccomanda di preparare almeno per xhdpi, xxhdpi e xxxhdpi — questo copre l'84% dei dispositivi attivi (2025). Per VectorDrawable, un singolo file senza qualificatore è sufficiente.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche