Objaśniamy podstawy dp (density-independent pixel) — jednostka miary w Androidzie, która zapewnia jednakowy fizyczny rozmiar elementów UI na ekranach o różnej gęstości pikseli. Jeden dp zawsze odpowiada 1/160 cala na ekranie, niezależnie od tego, jak wysoką lub niską rozdzielczość ma urządzenie. Według Google Material Design (2025), wszystkie rozmiary w aplikacjach Android powinny być podawane w dp, a nie w px, w przeciwnym razie interfejs będzie wyglądał inaczej na różnych urządzeniach.
Najważniejsze
dp (density-independent pixel) — to wirtualna jednostka miary w Androidzie, wprowadzona w celu ujednolicenia rozmiarów elementów UI na urządzeniach o różnej gęstości pikseli. Jeden dp odpowiada w przybliżeniu jednemu fizycznemu pikselowi na ekranie o gęstości 160 dpi (mdpi). Na ekranie o gęstości 320 dpi (xhdpi) 1 dp będzie równy 2 fizycznym pikselom. Tym samym fizyczny rozmiar elementu na ekranie pozostaje taki sam — około 1/160 cala. Według Android Developers (2025), dp to jedyna jednostka miary, którą należy stosować do rozmiarów layout, padding, margin oraz szerokości/wysokości widoków.
Jeśli ustawisz szerokość przycisku na 160 px, na ekranie mdpi będzie on miał szerokość 1 cala, a na ekranie xxxhdpi (640 dpi) — zaledwie 0.25 cala. dp rozwiązuje ten problem: 160 dp na każdym ekranie będzie równe 1 calowi. Android automatycznie konwertuje dp na px za pomocą DisplayMetrics.density podczas renderowania. Według Android Developer Blog (2025), przed wprowadzeniem dp (Android 1.0) programiści używali px ręcznie obliczając odstępy, co prowadziło do ciągłych błędów przy przenoszeniu aplikacji.
dp, px i sp — trzy jednostki miary w Androidzie, każda z własnym przeznaczeniem. px — fizyczny piksel ekranu, który zależy od gęstości. dp — piksel niezależny od gęstości dla rozmiarów elementów. sp — scale-independent pixel dla tekstu, który dodatkowo uwzględnia systemowe ustawienia rozmiaru czcionki. Według Material Design (2025), różnica między dp a sp to kluczowy aspekt dostępności: użytkownicy ze słabym wzrokiem zwiększają czcionkę, a wartości sp automatycznie się dostosowują, podczas gdy dp — nie.
| Jednostka | Pełna nazwa | Uwzględnia gęstość | Uwzględnia ustawienia czcionki | Zastosowanie |
|---|---|---|---|---|
| px | Pixel | Nie | Nie | Nie zalecany |
| dp | Density-independent Pixel | Tak | Nie | Layout, padding, marginesy |
| sp | Scale-independent Pixel | Tak | Tak | Rozmiar tekstu |
Wzór konwersji dp na px: px = dp × (dpi / 160). Do konwersji odwrotnej: dp = px / (dpi / 160). density — to stosunek dpi / 160, który Android oblicza na podstawie DisplayMetrics. Na mdpi density = 1.0, na hdpi = 1.5, na xhdpi = 2.0, na xxhdpi = 3.0, na xxxhdpi = 4.0. Zatem 48 dp w pikselach: na mdpi — 48 px, na xxhdpi — 144 px. Według Google I/O 2024, ten wzór można użyć do przybliżonej konwersji iOS pt (points) na dp — 1 pt ≈ 1 dp.
| Bucket | Density | Wartość dpi | 48 dp w px | 16 dp w 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 — plik zasobów Android w res/values/, przeznaczony do przechowywania wszystkich rozmiarów w dp (i sp dla tekstu). Centralizacja rozmiarów w dimens.xml ułatwia utrzymanie: zmiana jednej wartości w dimens.xml aktualizuje rozmiar we wszystkich ekranach aplikacji. Można tworzyć kwalifikowane pliki dimens.xml dla różnych gęstości (values-hdpi, values-xhdpi). Według Android Jetpack Docs (2025), Google zaleca przechowywanie w dimens.xml odstępów (margin, padding), szerokości elementów (stałe), rozmiary awatarów i wysokość 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>
W tym pliku każdy dimen ma nazwę i wartość. Użycie w plikach XML: @dimen/avatar_size. Według Material Design Guidelines (2025), podstawowy krok siatki w Androidzie to 8 dp (8-point grid). Wszystkie odstępy, rozmiary elementów i odległości powinny być wielokrotnościami 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. Dla tekstu krok wynosi 4 sp.
W plikach XML dp jest używane bezpośrednio: android:layout_width="48dp". W kodzie programowym (Kotlin/Java) należy konwertować dp na px za pomocą TypedResource lub funkcji rozszerzających. TypedResource udostępnia gotowe metody do pracy z dp w czasie wykonania: getDimensionPixelSize() zwraca całkowitą liczbę px. W Jetpack Compose dp to standardowa jednostka miary w modyfikatorach i kontenerach layout.
// Konwersja dp na px programowo
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Użycie w Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp jako wbudowana jednostka
Modifier
.padding(16.dp)
.size(48.dp)
W tym przykładzie dpToPx() — funkcja rozszerzająca dla Context, konwertująca dp na px z użyciem displayMetrics.density. W Jetpack Compose dp jest wbudowane w system typów i nie wymaga ręcznej konwersji — kompilator automatycznie tłumaczy dp na px na etapie renderowania.
<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"
/>
W XML dp podaje się jako przyrostek do liczby — margin_top="16dp". Dla tekstu używa się sp — textSize="@dimen/text_size_body". Odwołanie @dimen pozwala scentralizowanie zarządzać wartościami. Użycie match_parent dla szerokości i 48dp dla wysokości to standardowy wzorzec Material Design dla przycisków.
Według analizy aplikacji Android z Google Play Console (2025), pięć najczęstszych błędów: użycie px zamiast dp w plikach XML, brak dimens.xml (wartości wpisane inline), nieprawidłowa konwersja dp na px w kodzie (użycie dzielenia całkowitego), ignorowanie sp dla tekstu i nieuwzględnianie systemowych ustawień rozmiaru czcionki przez sp. Dzielenie całkowite to najniebezpieczniejszy błąd: w Kotlin val px = dp * density — jeśli dp i density są typu Int, wynik również będzie Int, a precyzja zostanie utracona.
Często zadawane pytania
dp w Androidzie i pt (points) w iOS — to równoważne jednostki miary. 1 dp w Androidzie odpowiada w przybliżeniu 1 pt w iOS. Oba pojęcia opisują punkty niezależne od gęstości: na starych urządzeniach z niską gęstością 1 dp/pt = 1 px, na nowoczesnych — 2-4 px. Różnica w wartości bazowej: Android używa 160 dpi jako podstawowej gęstości, iOS — 163 dpi, co daje błąd poniżej 2%.
W Jetpack Compose konwersja nie jest wymagana — dp jest wbudowane w system typów. Wszystkie modyfikatory i layouty przyjmują Dp, a nie px. Jeśli potrzebujesz uzyskać px z dp, użyj density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity udostępnia współczynnik konwersji uwzględniający gęstość ekranu urządzenia.
dp — termin dotyczący Androida. W iOS odpowiednikiem są pt (points). Swift automatycznie pracuje z punktami, które nie zależą od gęstości ekranu. W UIKit i SwiftUI wszystkie rozmiary podaje się w punktach, a system konwertuje je na px za pomocą scale factor ekranu (UIScreen.main.scale). Zasada jest taka sama, nazwa inna.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również