Spieghiamo le basi del dp (pixel indipendente dalla densità) — un'unità di misura in Android che garantisce la stessa dimensione fisica degli elementi dell'interfaccia su schermi con diversa densità di pixel. Un dp corrisponde sempre a 1/160 di pollice sullo schermo, indipendentemente dal fatto che il dispositivo abbia una risoluzione alta o bassa. Secondo Google Material Design (2025), tutte le dimensioni nelle applicazioni Android devono essere specificate in dp, non in px, altrimenti l'interfaccia apparirà diversa su dispositivi differenti.
Punti chiave
dp (pixel indipendente dalla densità) è un'unità di misura virtuale in Android, introdotta per uniformare le dimensioni degli elementi dell'interfaccia su dispositivi con diversa densità di pixel. Un dp equivale approssimativamente a un pixel fisico su uno schermo con densità di 160 dpi (mdpi). Su uno schermo con densità di 320 dpi (xhdpi), 1 dp equivale a 2 pixel fisici. Pertanto, la dimensione fisica di un elemento sullo schermo rimane la stessa — circa 1/160 di pollice. Secondo Android Developers (2025), dp è l'unica unità di misura che dovrebbe essere utilizzata per le dimensioni di layout, padding, margin e larghezza/altezza delle view.
Se si imposta la larghezza di un pulsante a 160 px, su uno schermo mdpi avrà una larghezza di 1 pollice, ma su uno schermo xxxhdpi (640 dpi) — solo 0,25 pollici. dp risolve questo problema: 160 dp su qualsiasi schermo equivalgono a 1 pollice. Android converte automaticamente dp in px tramite DisplayMetrics.density durante il rendering. Secondo Android Developer Blog (2025), prima dell'introduzione di dp (Android 1.0), gli sviluppatori calcolavano manualmente gli offset in px, causando bug costanti durante il porting.
dp, px e sp sono tre unità di misura in Android, ciascuna con il proprio scopo. px è un pixel fisico dello schermo che dipende dalla densità. dp è un pixel indipendente dalla densità per le dimensioni degli elementi. sp è un pixel indipendente dalla scala per il testo che tiene conto anche delle impostazioni di dimensione del carattere del sistema. Secondo Material Design (2025), la differenza tra dp e sp è un punto chiave di accessibilità: gli utenti con problemi di vista aumentano la dimensione del carattere e i valori sp si adattano automaticamente, mentre dp no.
| Unità | Nome completo | Tiene conto della densità | Tiene conto delle impostazioni del carattere | Utilizzo |
|---|---|---|---|---|
| px | Pixel | No | No | Non consigliato |
| dp | Pixel indipendente dalla densità | Sì | No | Layout, padding, margini |
| sp | Pixel indipendente dalla scala | Sì | Sì | Dimensione del testo |
La formula di conversione da dp a px: px = dp × (dpi / 160). Per la conversione inversa: dp = px / (dpi / 160). density è il rapporto dpi / 160, che Android calcola in base a DisplayMetrics. Su mdpi density = 1,0, su hdpi = 1,5, su xhdpi = 2,0, su xxhdpi = 3,0, su xxxhdpi = 4,0. Quindi, 48 dp in pixel: su mdpi — 48 px, su xxhdpi — 144 px. Secondo Google I/O 2024, questa formula può essere utilizzata per la conversione approssimativa di pt (punti) iOS in dp — 1 pt ≈ 1 dp.
| Bucket | Densità | Valore dpi | 48 dp in px | 16 dp in px |
|---|---|---|---|---|
| mdpi | 1.0 | 160 | 48 | 16 |
| hdpi | 1.5 | 240 | 72 | 24 |
| xhdpi | 2.0 | 320 | 96 | 32 |
| xxhdpi | 3.0 | 480 | 144 | 48 |
| xxxhdpi | 4.0 | 640 | 192 | 64 |
dimens.xml è un file di risorse Android in res/values/, destinato a memorizzare tutte le dimensioni in dp (e sp per il testo). Centralizzare le dimensioni in dimens.xml semplifica la manutenzione: la modifica di un valore in dimens.xml aggiorna la dimensione su tutti gli schermi dell'applicazione. È possibile creare file dimens.xml qualificati per diverse densità (values-hdpi, values-xhdpi). Secondo Android Jetpack Docs (2025), Google consiglia di memorizzare margini, padding, larghezze degli elementi (costanti), dimensioni degli avatar e altezza della barra degli strumenti in dimens.xml.
<resources>
<dimen name="margin_small">8dp</dimen>
<dimen name="margin_medium">16dp</dimen>
<dimen name="margin_large">24dp</dimen>
<dimen name="avatar_size">48dp</dimen>
<dimen name="toolbar_height">56dp</dimen>
<dimen name="text_size_body">14sp</dimen>
<dimen name="icon_size_small">24dp</dimen>
</resources>
In questo file, ogni dimen ha un nome e un valore. Utilizzo nel markup XML: @dimen/avatar_size. Secondo Material Design Guidelines (2025), il passo base della griglia in Android è 8 dp (griglia a 8 punti). Tutti i margini, le dimensioni degli elementi e le distanze devono essere multipli di 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. Per il testo, il passo è 4 sp.
Nel markup XML, dp viene utilizzato direttamente: android:layout_width="48dp". Nel codice programmatico (Kotlin/Java), è necessario convertire dp in px utilizzando TypedResource o funzioni di estensione. TypedResource fornisce metodi pronti per lavorare con dp in fase di esecuzione: getDimensionPixelSize() restituisce un valore intero in px. In Jetpack Compose, dp è l'unità di misura standard nei modificatori e nei contenitori di layout.
// Conversione programmatica di dp in px
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Utilizzo in Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp come unità integrata
Modifier
.padding(16.dp)
.size(48.dp)
In questo esempio, dpToPx() è una funzione di estensione per Context, che converte dp in px utilizzando displayMetrics.density. In Jetpack Compose, dp è integrato nel sistema di tipi e non richiede conversione manuale — il compilatore traduce automaticamente dp in px nella fase di rendering.
<Button
android:layout_width="match_parent"
android:layout_height="48dp"
android:padding="@dimen/margin_medium"
android:textSize="@dimen/text_size_body"
android:text="@string/button_label"
android:layout_marginTop="16dp"
/>
In XML, dp viene specificato come suffisso del numero — margin_top="16dp". Per il testo viene utilizzato sp — textSize="@dimen/text_size_body". Il riferimento @dimen consente una gestione centralizzata dei valori. L'uso di match_parent per la larghezza e 48dp per l'altezza è un pattern Material Design standard per i pulsanti.
Secondo un'analisi delle applicazioni Android da Google Play Console (2025), i cinque errori più comuni sono: utilizzo di px invece di dp nel markup XML, assenza di dimens.xml (valori scritti inline), conversione errata di dp in px nel codice (utilizzo della divisione intera), ignorare sp per il testo e non considerare le impostazioni di dimensione del carattere del sistema tramite sp. La divisione intera è l'errore più pericoloso: in Kotlin val px = dp * density — se dp e density sono Int, anche il risultato sarà Int e la precisione viene persa.
Domande frequenti
dp in Android e pt (punti) in iOS sono unità di misura equivalenti. 1 dp in Android equivale approssimativamente a 1 pt in iOS. Entrambi i concetti descrivono punti indipendenti dalla densità: sui vecchi dispositivi a bassa densità 1 dp/pt = 1 px, su quelli moderni — 2-4 px. La differenza sta nel valore base: Android utilizza 160 dpi come densità di base, iOS utilizza 163 dpi, con un margine di errore inferiore al 2%.
In Jetpack Compose non è necessaria alcuna conversione — dp è integrato nel sistema di tipi. Tutti i modificatori e i layout accettano Dp, non px. Se è necessario ottenere px da dp, utilizzare density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity fornisce il fattore di conversione che tiene conto della densità dello schermo del dispositivo.
dp è un termine Android. In iOS, l'equivalente è pt (punti). Swift funziona automaticamente con punti indipendenti dalla densità dello schermo. In UIKit e SwiftUI, tutte le dimensioni sono specificate in punti e il sistema le converte in px utilizzando il fattore di scala dello schermo (UIScreen.main.scale). Stesso principio, nome diverso.
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