Vysvětlujeme základy dp (density-independent pixel) — měrné jednotky v Androidu, která zajišťuje stejnou fyzickou velikost UI prvků na obrazovkách s různou hustotou pixelů. Jeden dp vždy odpovídá 1/160 palce na obrazovce, bez ohledu na to, jak vysoké nebo nízké rozlišení zařízení má. Podle Google Material Design (2025) musí být všechny rozměry v Android aplikacích zadávány v dp, nikoli v px, jinak bude rozhraní vypadat na různých zařízeních odlišně.
Hlavní Body
dp (density-independent pixel) — je virtuální měrná jednotka v Androidu, zavedená pro sjednocení rozměrů UI prvků na zařízeních s různou hustotou pixelů. Jeden dp je přibližně roven jednomu fyzickému pixelu na obrazovce s hustotou 160 dpi (mdpi). Na obrazovce s hustotou 320 dpi (xhdpi) bude 1 dp roven 2 fyzickým pixelům. Tím pádem fyzická velikost prvku na obrazovce zůstává stejná — přibližně 1/160 palce. Podle Android Developers (2025) je dp jedinou měrnou jednotkou, kterou je třeba používat pro rozměry layout, padding, margin a šířku/výšku view.
Pokud nastavíte šířku tlačítka na 160 px, na mdpi obrazovce bude mít šířku 1 palec, zatímco na xxxhdpi obrazovce (640 dpi) — pouze 0,25 palce. dp řeší tento problém: 160 dp na jakékoli obrazovce bude rovno 1 palci. Android automaticky převádí dp na px pomocí DisplayMetrics.density při vykreslování. Podle Android Developer Blog (2025) před zavedením dp (Android 1.0) vývojáři ručně počítali px, což vedlo k neustálým chybám při portování.
dp, px a sp — tři měrné jednotky v Androidu, každá se svým účelem. px — fyzický pixel obrazovky, který závisí na hustotě. dp — pixel nezávislý na hustotě pro rozměry prvků. sp — scale-independent pixel pro text, který navíc zohledňuje systémová nastavení velikosti písma. Podle Material Design (2025) je rozdíl mezi dp a sp klíčovým aspektem přístupnosti: uživatelé se slabým zrakem zvětšují písmo a hodnoty sp se automaticky přizpůsobují, zatímco dp — ne.
| Jednotka | Plný název | Zohledňuje hustotu | Zohledňuje nastavení písma | Použití |
|---|---|---|---|---|
| px | Pixel | Ne | Ne | Nedoporučuje se |
| dp | Density-independent Pixel | Ano | Ne | Layout, padding, okraje |
| sp | Scale-independent Pixel | Ano | Ano | Velikost textu |
Vzorec převodu dp na px: px = dp × (dpi / 160). Pro zpětný převod: dp = px / (dpi / 160). density — poměr dpi / 160, který Android vypočítává na základě DisplayMetrics. Na mdpi density = 1.0, na hdpi = 1.5, na xhdpi = 2.0, na xxhdpi = 3.0, na xxxhdpi = 4.0. Tedy 48 dp v pixelech: na mdpi — 48 px, na xxhdpi — 144 px. Podle Google I/O 2024 lze tento vzorec použít pro přibližný převod iOS pt (points) na dp — 1 pt ≈ 1 dp.
| Bucket | Density | Hodnota dpi | 48 dp v px | 16 dp v 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 — soubor prostředků Android v res/values/, určený pro ukládání všech rozměrů v dp (a sp pro text). Centralizace rozměrů v dimens.xml zjednodušuje údržbu: změna jedné hodnoty v dimens.xml aktualizuje rozměr na všech obrazovkách aplikace. Lze vytvářet kvalifikované soubory dimens.xml pro různé hustoty (values-hdpi, values-xhdpi). Podle Android Jetpack Docs (2025) Google doporučuje ukládání do dimens.xml mezer (margin, padding), šířek prvků (konstanty), velikostí avatarů a výšky panelu nástrojů.
<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>
V tomto souboru každý dimen má název a hodnotu. Použití v XML souborech: @dimen/avatar_size. Podle Material Design Guidelines (2025) je základní krok mřížky v Androidu 8 dp (8-point grid). Všechny mezery, velikosti prvků a vzdálenosti by měly být násobky 8 dp: 8, 16, 24, 32, 48, 56, 64, 72 dp. Pro text je krok 4 sp.
V XML souborech se dp používá přímo: android:layout_width="48dp". V programovém kódu (Kotlin/Java) je nutné převést dp na px pomocí TypedResource nebo rozšiřujících funkcí. TypedResource poskytuje hotové metody pro práci s dp za běhu: getDimensionPixelSize() vrací celé číslo px. V Jetpack Compose je dp standardní měrnou jednotkou v modifikátorech a layout kontejnerech.
// Programový převod dp na px
fun Context.dpToPx(dp: Int): Int {
return (dp * resources
.displayMetrics
.density).toInt()
}
// Použití v Activity
val paddingPx = dpToPx(16)
button.setPadding(
paddingPx,
paddingPx,
paddingPx,
paddingPx,
)
// Jetpack Compose: dp jako vestavěná jednotka
Modifier
.padding(16.dp)
.size(48.dp)
V tomto příkladu dpToPx() — rozšiřující funkce pro Context, která převádí dp na px pomocí displayMetrics.density. V Jetpack Compose je dp integrováno do typového systému a nevyžaduje ruční převod — kompilátor automaticky překládá dp na px ve fázi vykreslování.
<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"
/>
V XML se dp uvádí jako přípona čísla — margin_top="16dp". Pro text se používá sp — textSize="@dimen/text_size_body". Odkaz @dimen umožňuje centralizovanou správu hodnot. Použití match_parent pro šířku a 48dp pro výšku je standardní vzor Material Design pro tlačítka.
Podle analýzy Android aplikací z Google Play Console (2025) je pět nejčastějších chyb: použití px místo dp v XML souborech, chybějící dimens.xml (hodnoty zapsány inline), nesprávný převod dp na px v kódu (použití celočíselného dělení), ignorování sp pro text a nezohlednění systémových nastavení velikosti písma přes sp. Celočíselné dělení je nejnebezpečnější chyba: v Kotlin val px = dp * density — pokud jsou dp a density Int, výsledek bude také Int a přesnost se ztrácí.
Často kladené otázky
dp v Androidu a pt (points) v iOS — jsou ekvivalentní měrné jednotky. 1 dp v Androidu je přibližně rovno 1 pt v iOS. Oba koncepty popisují body nezávislé na hustotě: na starých zařízeních s nízkou hustotou 1 dp/pt = 1 px, na moderních — 2-4 px. Rozdíl v základní hodnotě: Android používá 160 dpi jako základní hustotu, iOS — 163 dpi, což poskytuje chybu menší než 2%.
V Jetpack Compose není převod nutný — dp je integrováno v typovém systému. Všechny modifikátory a layouty přijímají Dp, nikoli px. Pokud potřebujete získat px z dp, použijte density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity poskytuje převodní koeficient zohledňující hustotu obrazovky zařízení.
dp — termín Androidu. V iOS je obdobou pt (points). Swift automaticky pracuje s body, které nezávisí na hustotě obrazovky. V UIKit a SwiftUI se všechny rozměry zadávají v bodech a systém je převádí na px pomocí scale factor obrazovky (UIScreen.main.scale). Princip je stejný, název jiný.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také