dp — основе, пиксели независни од густине у Android-у

Аутор: IT Sectr Објављено: 2026-02-25 Време читања: 7 мин

Објашњавамо основе dp (density-independent pixel) — мерна јединица у Android-у која обезбеђује исту физичку величину UI елемената на екранима са различитом густином пиксела. Један dp увек одговара 1/160 инча на екрану, без обзира на то колико уређај има високу или ниску резолуцију. Према Google Material Design (2025), све величине у Android апликацијама треба да се задају у dp, а не у px, иначе ће интерфејс изгледати другачије на различитим уређајима.

Главно

  • dp (density-independent pixel) — апстрактна мерна јединица у Android-у, једнака 1/160 инча на екрану.
  • Формула конверзије: px = dp × (dpi / 160). На mdpi екрану 1 dp = 1 px, на xxhdpi 1 dp = 3 px.
  • Све величине у XML-у (layout_width, padding, margin) се задају у dp.
  • dimens.xml — датотека ресурса Android за централизовано чување вредности dp.
  • Према Google Android Performance Guide (2025), употреба dp уместо px елиминише 90% проблема са адаптацијом интерфејса на различитим екранима.

Шта је dp у Android-у?

dp (density-independent pixel) — виртуелна мерна јединица у Android-у, уведена ради унификације величина UI елемената на уређајима са различитом густином пиксела. Један dp је приближно једнак једном физичком пикселу на екрану са густином од 160 dpi (mdpi). На екрану са густином од 320 dpi (xhdpi) 1 dp ће бити једнак 2 физичка пиксела. На тај начин, физичка величина елемента на екрану остаје иста — око 1/160 инча. Према Android Developers (2025), dp је једина мерна јединица коју треба користити за величине layout, padding, margin и ширину/висину view-ова.

Зашто се не сме користити px

Ако задате дугмету ширину од 160 px, на mdpi екрану биће широко 1 инч, а на xxxhdpi екрану (640 dpi) — само 0.25 инча. dp решава овај проблем: 160 dp на било ком екрану биће једнако 1 инчу. Android аутоматски конвертује dp у px преко DisplayMetrics.density приликом приказивања. Према Android Developer Blog (2025), пре увођења dp (Android 1.0), програмери су ручно израчунавали px, што је доводило до сталних грешака при портовању.

dp, px и sp: у чему је разлика

dp, px и sp — три мерне јединице у Android-у, свака са својом наменом. px — физички пиксел екрана, који зависи од густине. dp — пиксел независан од густине за величине елемената. sp — scale-independent pixel за текст, који додатно узима у обзир системска подешавања величине фонта. Према Material Design (2025), разлика између dp и sp је кључни аспект приступачности: корисници са слабим видом повећавају фонт, и sp вредности се аутоматски прилагођавају, док dp — не.

ЈединицаПуни називУзима у обзир густинуУзима у обзир подешавања фонтаПримена
pxPixelНеНеНе препоручује се
dpDensity-independent PixelДаНеLayout, padding, маргине
spScale-independent PixelДаДаВеличина текста

Формула конверзије dp у px и обрнуто

Формула конверзије dp у px: px = dp × (dpi / 160). За обрнуту конверзију: dp = px / (dpi / 160). density — однос dpi / 160, који Android израчунава на основу DisplayMetrics. На mdpi density = 1.0, на hdpi = 1.5, на xhdpi = 2.0, на xxhdpi = 3.0, на xxxhdpi = 4.0. Дакле, 48 dp у пикселима: на mdpi — 48 px, на xxhdpi — 144 px. Према Google I/O 2024, ова формула се може користити за приближну конверзију iOS pt (points) у dp — 1 pt ≈ 1 dp.

BucketDensitydpi вредност48 dp у px16 dp у px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: централизовано управљање величинама

dimens.xml — датотека ресурса Android у res/values/, намењена за чување свих величина у dp (и sp за текст). Централизација величина у dimens.xml поједностављује одржавање: промена једне вредности у dimens.xml ажурира величину на свим екранима апликације. Могу се креирати квалификоване dimens.xml датотеке за различите густине (values-hdpi, values-xhdpi). Према Android Jetpack Docs (2025), Google препоручује чување у dimens.xml размака (margin, padding), ширина елемената (константе), величина аватара и висину toolbar-а.

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>

У овој датотеци сваки dimen има име и вредност. Употреба у XML датотекама: @dimen/avatar_size. Према Material Design Guidelines (2025), основни корак мреже у Android-у је 8 dp (8-point grid). Сви размаци, величине елемената и растојања треба да буду умножак од 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. За текст корак је 4 sp.

Програмска употреба dp у Kotlin и XML-у

У XML датотекама dp се користи директно: android:layout_width="48dp". У програмском коду (Kotlin/Java) потребно је конвертовати dp у px помоћу TypedResource или extension функција. TypedResource пружа готове методе за рад са dp у рантајму: getDimensionPixelSize() враћа цео број px. У Jetpack Compose, dp је стандардна мерна јединица у модификаторима и layout контејнерима.

Kotlin
// Програмска конверзија dp у px
fun Context.dpToPx(dp: Int): Int {
    return (dp * resources
        .displayMetrics
        .density).toInt()
}

// Употреба у Activity
val paddingPx = dpToPx(16)
button.setPadding(
    paddingPx,
    paddingPx,
    paddingPx,
    paddingPx,
)

// Jetpack Compose: dp као уграђена јединица
Modifier
    .padding(16.dp)
    .size(48.dp)

У овом примеру dpToPx() — extension функција за Context, која конвертује dp у px користећи displayMetrics.density. У Jetpack Compose, dp је уграђен у систем типова и не захтева ручну конверзију — компајлер аутоматски преводи dp у px у фази приказивања.

XML датотеке са 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"
/>

У XML-у dp се наводи као суфикс уз број — margin_top="16dp". За текст се користи sp — textSize="@dimen/text_size_body". Референца @dimen омогућава централизовано управљање вредностима. Употреба match_parent за ширину и 48dp за висину је стандардни образац Material Design за дугмад.

Типичне грешке при употреби dp

Према анализи Android апликација од Google Play Console (2025), пет најчешћих грешака: употреба px уместо dp у XML датотекама, недостатак dimens.xml (вредности уписане inline), нетачна конверзија dp у px у коду (коришћење целобројног дељења), игнорисање sp за текст и невођење рачуна о системским подешавањима величине фонта преко sp. Целобројно дељење је најопаснија грешка: у Kotlin-у val px = dp * density — ако су dp и density Int, резултат ће такође бити Int, а прецизност се губи.

  • px уместо dp — апликација изгледа другачије на уређајима са различитом густином. Исправка: замена px са dp у XML-у.
  • Inline вредности — величине су уписане директно у layout датотеке. Дуплирање вредности отежава одржавање и ажурирање.
  • sp за текст — употреба dp за величину фонта занемарује подешавања корисника, нарушавајући приступачност.
  • Целобројно дељење — у Kotlin-у дељење Int са Int даје Int, губећи разломљени део. Увек користите Float.

Често постављана питања

По чему се dp разликује од pt у iOS-у?

dp у Android-у и pt (points) у iOS-у — еквивалентне су мерне јединице. 1 dp у Android-у приближно је једнак 1 pt у iOS-у. Оба концепта описују тачке независне од густине: на старим уређајима са ниском густином 1 dp/pt = 1 px, на модерним — 2-4 px. Разлика у основној вредности: Android користи 160 dpi као основну густину, iOS — 163 dpi, што даје грешку мању од 2%.

Како конвертовати dp у px у Jetpack Compose-у?

У Jetpack Compose-у конверзија није потребна — dp је уграђен у систем типова. Сви модификатори и layout-ови прихватају Dp, а не px. Ако је потребно добити px из dp, користите density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity обезбеђује коефицијент конверзије који узима у обзир густину екрана уређаја.

Да ли треба користити dp у iOS-у?

dp — Android термин. У iOS-у аналог су pt (points). Swift аутоматски ради са тачкама које не зависе од густине екрана. У UIKit и SwiftUI све величине се задају у тачкама, а систем их конвертује у px помоћу scale factor екрана (UIScreen.main.scale). Принцип је исти, назив је другачији.

Закључци

  • dp — Density-independent Pixel, апстрактна јединица за UI величине у Android-у, једнака 1/160 инча.
  • Формула: px = dp × (dpi / 160). На mdpi 1 dp = 1 px, на xxhdpi 1 dp = 3 px.
  • Све величине у XML датотекама треба задавати у dp, величина текста — у sp.
  • dimens.xml — централизовано чување величина. Једна измена ажурира цео интерфејс.
  • 8-point grid: све величине су умножак од 8 dp, размаци текста — 4 sp.
  • У програмском коду користите TypedResource или extension функције за конверзију dp у px.

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође