dp — bazele, pixelii independenți de densitate în Android

Autor: IT Sectr Publicat: 2026-02-25 Timp de citire: 7 min

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) — unitate abstractă de măsură în Android, egală cu 1/160 de inch pe ecran.
  • Formula de conversie: px = dp × (dpi / 160). Pe ecranul mdpi 1 dp = 1 px, pe xxhdpi 1 dp = 3 px.
  • Toate dimensiunile în XML (layout_width, padding, margin) se exprimă în dp.
  • dimens.xml — fișierul de resurse Android pentru stocarea centralizată a valorilor dp.
  • Potrivit Google Android Performance Guide (2025), utilizarea dp în loc de px elimină 90% din problemele de adaptare a interfeței pe diferite ecrane.

Ce este dp în Android?

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.

De ce nu se poate folosi px

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: care este diferența

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.

UnitateDenumire completăIa în calcul densitateaIa în calcul setările fontuluiAplicație
pxPixelNuNuNerecomandat
dpDensity-independent PixelDaNuLayout, padding, margini
spScale-independent PixelDaDaDimensiunea textului

Formula de conversie dp în px și invers

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.

BucketDensityValoarea dpi48 dp în px16 dp în px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: gestionarea centralizată a dimensiunilor

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.

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>

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

Utilizarea programatică a dp în Kotlin și XML

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

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

Fișiere XML cu 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"
/>

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

Erori tipice la utilizarea dp

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.

  • px în loc de dp — aplicația arată diferit pe dispozitive cu densități diferite. Corectare: înlocuirea px cu dp în XML.
  • Valori inline — dimensiunile sunt scrise direct în fișierele layout. Duplicarea valorilor complică întreținerea și actualizarea.
  • sp pentru text — utilizarea dp pentru dimensiunea fontului ignoră setările utilizatorului, încălcând accesibilitatea.
  • Împărțirea întreagă — în Kotlin împărțirea Int la Int dă Int, pierzând partea fracționară. Folosiți întotdeauna Float.

Întrebări frecvente

Cu ce se deosebește dp de pt în iOS?

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

Cum se convertește dp în px în Jetpack Compose?

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

Trebuie să folosesc dp în iOS?

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

  • dp — Density-independent Pixel, unitate abstractă pentru dimensiunile UI în Android, egală cu 1/160 de inch.
  • Formula: px = dp × (dpi / 160). Pe mdpi 1 dp = 1 px, pe xxhdpi 1 dp = 3 px.
  • Toate dimensiunile în fișierele XML trebuie exprimate în dp, dimensiunea textului — în sp.
  • dimens.xml — stocarea centralizată a dimensiunilor. O singură modificare actualizează întreaga interfață.
  • 8-point grid: toate dimensiunile sunt multipli de 8 dp, spațierile textului — 4 sp.
  • În codul programatic utilizați TypedResource sau funcții de extensie pentru conversia dp în px.

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.

Discutați proiectul

Citiți și