dp — podstawy, gęstościowo-niezależne piksele w Androidzie

Autor: IT Sectr Opublikowano: 2026-02-25 Czas czytania: 7 min

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) — abstrakcyjna jednostka miary w Androidzie, równa 1/160 cala na ekranie.
  • Wzór konwersji: px = dp × (dpi / 160). Na ekranie mdpi 1 dp = 1 px, na xxhdpi 1 dp = 3 px.
  • Wszystkie rozmiary w plikach XML (layout_width, padding, margin) podaje się w dp.
  • dimens.xml — plik zasobów Android do scentralizowanego przechowywania wartości dp.
  • Według Google Android Performance Guide (2025), użycie dp zamiast px eliminuje 90% problemów z adaptacją interfejsu na różnych ekranach.

Co to jest dp w Androidzie?

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.

Dlaczego nie można używać px

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: jaka jest różnica

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.

JednostkaPełna nazwaUwzględnia gęstośćUwzględnia ustawienia czcionkiZastosowanie
pxPixelNieNieNie zalecany
dpDensity-independent PixelTakNieLayout, padding, marginesy
spScale-independent PixelTakTakRozmiar tekstu

Wzór konwersji dp na px i odwrotnie

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.

BucketDensityWartość dpi48 dp w px16 dp w px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: scentralizowane zarządzanie rozmiarami

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.

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>

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.

Programowe użycie dp w Kotlin i XML

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.

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

Pliki XML z 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"
/>

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.

Typowe błędy przy użyciu dp

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.

  • px zamiast dp — aplikacja wygląda inaczej na urządzeniach o różnej gęstości. Poprawka: zastąpienie px przez dp w XML.
  • Inline wartości — rozmiary wpisane bezpośrednio w pliki layout. Duplikowanie wartości utrudnia utrzymanie i aktualizację.
  • sp dla tekstu — użycie dp dla rozmiaru czcionki ignoruje ustawienia użytkownika, naruszając dostępność.
  • Dzielenie całkowite — w Kotlin dzielenie Int przez Int daje Int, tracąc część ułamkową. Zawsze używaj Float.

Często zadawane pytania

Czym różni się dp od pt w iOS?

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

Jak przekonwertować dp na px w Jetpack Compose?

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.

Czy trzeba używać dp w iOS?

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

  • dp — Density-independent Pixel, abstrakcyjna jednostka dla rozmiarów UI w Androidzie, równa 1/160 cala.
  • Wzór: px = dp × (dpi / 160). Na mdpi 1 dp = 1 px, na xxhdpi 1 dp = 3 px.
  • Wszystkie rozmiary w plikach XML należy podawać w dp, rozmiar tekstu — w sp.
  • dimens.xml — scentralizowane przechowywanie rozmiarów. Jedna zmiana aktualizuje cały interfejs.
  • 8-point grid: wszystkie rozmiary są wielokrotnościami 8 dp, odstępy tekstu — 4 sp.
  • W kodzie programowym używaj TypedResource lub funkcji rozszerzających do konwersji dp na px.

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.

Omów projekt

Przeczytaj również