Објашњавамо основе dp (density-independent pixel) — мерна јединица у Android-у која обезбеђује исту физичку величину UI елемената на екранима са различитом густином пиксела. Један dp увек одговара 1/160 инча на екрану, без обзира на то колико уређај има високу или ниску резолуцију. Према Google Material Design (2025), све величине у Android апликацијама треба да се задају у dp, а не у px, иначе ће интерфејс изгледати другачије на различитим уређајима.
Главно
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-ова.
Ако задате дугмету ширину од 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 — три мерне јединице у Android-у, свака са својом наменом. px — физички пиксел екрана, који зависи од густине. dp — пиксел независан од густине за величине елемената. sp — scale-independent pixel за текст, који додатно узима у обзир системска подешавања величине фонта. Према Material Design (2025), разлика између dp и sp је кључни аспект приступачности: корисници са слабим видом повећавају фонт, и sp вредности се аутоматски прилагођавају, док dp — не.
| Јединица | Пуни назив | Узима у обзир густину | Узима у обзир подешавања фонта | Примена |
|---|---|---|---|---|
| px | Pixel | Не | Не | Не препоручује се |
| dp | Density-independent Pixel | Да | Не | Layout, padding, маргине |
| sp | Scale-independent Pixel | Да | Да | Величина текста |
Формула конверзије 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.
| Bucket | Density | dpi вредност | 48 dp у px | 16 dp у 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 — датотека ресурса 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-а.
<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.
У XML датотекама dp се користи директно: android:layout_width="48dp". У програмском коду (Kotlin/Java) потребно је конвертовати dp у px помоћу TypedResource или extension функција. TypedResource пружа готове методе за рад са dp у рантајму: getDimensionPixelSize() враћа цео број px. У Jetpack Compose, dp је стандардна мерна јединица у модификаторима и layout контејнерима.
// Програмска конверзија 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 у фази приказивања.
<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 за дугмад.
Према анализи Android апликација од Google Play Console (2025), пет најчешћих грешака: употреба px уместо dp у XML датотекама, недостатак dimens.xml (вредности уписане inline), нетачна конверзија dp у px у коду (коришћење целобројног дељења), игнорисање sp за текст и невођење рачуна о системским подешавањима величине фонта преко sp. Целобројно дељење је најопаснија грешка: у Kotlin-у val px = dp * density — ако су dp и density Int, резултат ће такође бити Int, а прецизност се губи.
Често постављана питања
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%.
У Jetpack Compose-у конверзија није потребна — dp је уграђен у систем типова. Сви модификатори и layout-ови прихватају Dp, а не px. Ако је потребно добити px из dp, користите density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity обезбеђује коефицијент конверзије који узима у обзир густину екрана уређаја.
dp — Android термин. У iOS-у аналог су pt (points). Swift аутоматски ради са тачкама које не зависе од густине екрана. У UIKit и SwiftUI све величине се задају у тачкама, а систем их конвертује у px помоћу scale factor екрана (UIScreen.main.scale). Принцип је исти, назив је другачији.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође