dp — basi, pixel indipendenti dalla densità in Android

Autore: IT Sectr Pubblicato: 2026-02-25 Tempo di lettura: 7 min

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 astratta in Android, pari a 1/160 di pollice sullo schermo.
  • Formula di conversione: px = dp × (dpi / 160). Su schermi mdpi 1 dp = 1 px, su xxhdpi 1 dp = 3 px.
  • Tutte le dimensioni nei layout XML (layout_width, padding, margin) sono specificate in dp.
  • dimens.xml — file di risorse Android per l'archiviazione centralizzata dei valori dp.
  • Secondo Google Android Performance Guide (2025), l'uso di dp invece di px elimina il 90% dei problemi di adattamento dell'interfaccia su schermi diversi.

Cos'è dp in Android?

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.

Perché non usare px

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: qual è la differenza

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 completoTiene conto della densitàTiene conto delle impostazioni del carattereUtilizzo
pxPixelNoNoNon consigliato
dpPixel indipendente dalla densitàNoLayout, padding, margini
spPixel indipendente dalla scalaDimensione del testo

Formula per convertire dp in px e viceversa

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.

BucketDensitàValore dpi48 dp in px16 dp in px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: gestione centralizzata delle dimensioni

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.

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.

Uso programmatico di dp in Kotlin e XML

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.

Kotlin
// 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.

Markup XML con dp

XML

<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.

Errori comuni nell'uso di dp

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.

  • px invece di dp — l'applicazione appare diversa su dispositivi con densità differenti. Si risolve sostituendo px con dp in XML.
  • Valori inline — le dimensioni sono scritte direttamente nei file di layout. Duplicare i valori complica la manutenzione e gli aggiornamenti.
  • sp per il testo — l'uso di dp per la dimensione del carattere ignora le impostazioni dell'utente, compromettendo l'accessibilità.
  • Divisione intera — in Kotlin, dividere Int per Int produce Int, perdendo la parte frazionaria. Utilizzare sempre Float.

Domande frequenti

In cosa dp differisce da pt in iOS?

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%.

Come convertire dp in px in Jetpack Compose?

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.

Devo usare dp in iOS?

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

  • dp — Pixel indipendente dalla densità, un'unità astratta per le dimensioni dell'interfaccia in Android, pari a 1/160 di pollice.
  • Formula: px = dp × (dpi / 160). Su mdpi 1 dp = 1 px, su xxhdpi 1 dp = 3 px.
  • Tutte le dimensioni nel markup XML devono essere specificate in dp, la dimensione del testo in sp.
  • dimens.xml — archiviazione centralizzata delle dimensioni. Una modifica aggiorna l'intera interfaccia.
  • Griglia a 8 punti: tutte le dimensioni sono multiple di 8 dp, spaziatura del testo — 4 sp.
  • Nel codice programmatico, utilizzare TypedResource o funzioni di estensione per la conversione da dp a px.

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.

Discuti il progetto

Leggi anche