Explicăm bazele dp (density-independent pixel) — unitatea de măsură în Android care asigură aceeași dimensiune fizică a elementelor UI pe ecrane cu densități diferite de pixeli. Un dp corespunde întotdeauna la 1/160 de inch pe ecran, indiferent de cât de înaltă sau joasă este rezoluția dispozitivului. Potrivit Google Material Design (2025), toate dimensiunile în aplicațiile Android trebuie exprimate în dp, nu în px, altfel interfața va arăta diferit pe diferite dispozitive.
Principalele
dp (density-independent pixel) — este o unitate virtuală de măsură în Android, introdusă pentru unificarea dimensiunilor elementelor UI pe dispozitive cu densități diferite de pixeli. Un dp este aproximativ egal cu un pixel fizic pe un ecran cu densitatea de 160 dpi (mdpi). Pe un ecran cu densitatea de 320 dpi (xhdpi), 1 dp va fi egal cu 2 pixeli fizici. Astfel, dimensiunea fizică a elementului pe ecran rămâne aceeași — aproximativ 1/160 de inch. Potrivit Android Developers (2025), dp este singura unitate de măsură care trebuie utilizată pentru dimensiunile layout, padding, margin și lățimea/înălțimea view-urilor.
Dacă setați lățimea unui buton la 160 px, pe ecranul mdpi va avea lățimea de 1 inch, iar pe ecranul xxxhdpi (640 dpi) — doar 0.25 inch. dp rezolvă această problemă: 160 dp pe orice ecran va fi egal cu 1 inch. Android convertește automat dp în px prin DisplayMetrics.density la randare. Potrivit Android Developer Blog (2025), înainte de introducerea dp (Android 1.0), dezvoltatorii foloseau px calculând manual distanțele, ceea ce ducea la erori constante la portare.
dp, px și sp — trei unități de măsură în Android, fiecare cu scopul său. px — pixelul fizic al ecranului, care depinde de densitate. dp — pixelul independent de densitate pentru dimensiunile elementelor. sp — scale-independent pixel pentru text, care ia în plus în considerare setările sistemului de dimensiune a fontului. Potrivit Material Design (2025), diferența dintre dp și sp este un aspect cheie al accesibilității: utilizatorii cu vedere slabă măresc fontul, iar valorile sp se ajustează automat, pe când dp — nu.
| Unitate | Denumire completă | Ia în calcul densitatea | Ia în calcul setările fontului | Aplicație |
|---|---|---|---|---|
| px | Pixel | Nu | Nu | Nerecomandat |
| dp | Density-independent Pixel | Da | Nu | Layout, padding, margini |
| sp | Scale-independent Pixel | Da | Da | Dimensiunea textului |
Formula de conversie dp în px: px = dp × (dpi / 160). Pentru conversia inversă: dp = px / (dpi / 160). density — este raportul dpi / 160, pe care Android îl calculează pe baza DisplayMetrics. Pe mdpi density = 1.0, pe hdpi = 1.5, pe xhdpi = 2.0, pe xxhdpi = 3.0, pe xxxhdpi = 4.0. Astfel, 48 dp în pixeli: pe mdpi — 48 px, pe xxhdpi — 144 px. Potrivit Google I/O 2024, această formulă poate fi utilizată pentru conversia aproximativă a pt (points) din iOS în dp — 1 pt ≈ 1 dp.
| Bucket | Density | Valoarea dpi | 48 dp în px | 16 dp în 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 — fișierul de resurse Android în res/values/, destinat stocării tuturor dimensiunilor în dp (și sp pentru text). Centralizarea dimensiunilor în dimens.xml simplifică întreținerea: modificarea unei valori în dimens.xml actualizează dimensiunea în toate ecranele aplicației. Se pot crea fișiere dimens.xml calificate pentru diferite densități (values-hdpi, values-xhdpi). Potrivit Android Jetpack Docs (2025), Google recomandă stocarea în dimens.xml a spațierilor (margin, padding), lățimii elementelor (constante), dimensiunii avatarurilor și înălțimii barei de instrumente.
<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>
În acest fișier fiecare dimen are un nume și o valoare. Utilizarea în fișierele XML: @dimen/avatar_size. Potrivit Material Design Guidelines (2025), pasul de bază al rețelei în Android este 8 dp (8-point grid). Toate spațierile, dimensiunile elementelor și distanțele trebuie să fie multipli de 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. Pentru text, pasul este de 4 sp.
În fișierele XML, dp se utilizează direct: android:layout_width="48dp". În codul programatic (Kotlin/Java) este necesar să convertiți dp în px cu ajutorul TypedResource sau funcțiilor de extensie. TypedResource oferă metode gata pentru lucrul cu dp în runtime: getDimensionPixelSize() returnează un număr întreg de px. În Jetpack Compose, dp este unitatea standard de măsură în modificatori și containerele layout.
// Conversia programatică a dp în px
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Utilizarea în Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp ca unitate încorporată
Modifier
.padding(16.dp)
.size(48.dp)
În acest exemplu dpToPx() — funcție de extensie pentru Context, care convertește dp în px utilizând displayMetrics.density. În Jetpack Compose, dp este integrat în sistemul de tipuri și nu necesită conversie manuală — compilatorul traduce automat dp în px în faza de randare.
<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"
/>
În XML, dp se indică ca sufix al numărului — margin_top="16dp". Pentru text se utilizează sp — textSize="@dimen/text_size_body". Referința @dimen permite gestionarea centralizată a valorilor. Utilizarea match_parent pentru lățime și 48dp pentru înălțime este un model standard Material Design pentru butoane.
Potrivit analizei aplicațiilor Android de la Google Play Console (2025), cele mai frecvente cinci erori: utilizarea px în loc de dp în fișierele XML, lipsa dimens.xml (valorile scrise inline), conversia incorectă a dp în px în cod (utilizarea împărțirii întregi), ignorarea sp pentru text și neținerea cont de setările sistemului de dimensiune a fontului prin sp. Împărțirea întreagă este cea mai periculoasă eroare: în Kotlin val px = dp * density — dacă dp și density sunt Int, rezultatul va fi de asemenea Int, iar precizia se pierde.
Întrebări frecvente
dp în Android și pt (points) în iOS — sunt unități de măsură echivalente. 1 dp în Android este aproximativ egal cu 1 pt în iOS. Ambele concepte descriu puncte independente de densitate: pe dispozitivele vechi cu densitate scăzută 1 dp/pt = 1 px, pe cele moderne — 2-4 px. Diferența în valoarea de bază: Android utilizează 160 dpi ca densitate de bază, iOS — 163 dpi, ceea ce oferă o eroare sub 2%.
În Jetpack Compose conversia nu este necesară — dp este integrat în sistemul de tipuri. Toți modificatorii și layout-urile acceptă Dp, nu px. Dacă trebuie să obțineți px din dp, utilizați density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity oferă coeficientul de conversie care ține cont de densitatea ecranului dispozitivului.
dp — termen din Android. În iOS, echivalentul sunt pt (points). Swift lucrează automat cu puncte care nu depind de densitatea ecranului. În UIKit și SwiftUI, toate dimensiunile se exprimă în puncte, iar sistemul le convertește în px cu ajutorul scale factor al ecranului (UIScreen.main.scale). Principiul este același, denumirea diferită.
Concluzii
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