dp — základy, pixely nezávislé na hustotě v Androidu

Autor: IT Sectr Publikováno: 2026-02-25 Doba čtení: 7 min

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) — abstraktní měrná jednotka v Androidu, rovná 1/160 palce na obrazovce.
  • Vzorec převodu: px = dp × (dpi / 160). Na mdpi obrazovce 1 dp = 1 px, na xxhdpi 1 dp = 3 px.
  • Všechny rozměry v XML (layout_width, padding, margin) se zadávají v dp.
  • dimens.xml — soubor prostředků Android pro centralizované ukládání hodnot dp.
  • Podle Google Android Performance Guide (2025) použití dp místo px eliminuje 90% problémů s adaptací rozhraní na různých obrazovkách.

Co je dp v Androidu?

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.

Proč nelze použít px

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: jaký je rozdíl

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.

JednotkaPlný názevZohledňuje hustotuZohledňuje nastavení písmaPoužití
pxPixelNeNeNedoporučuje se
dpDensity-independent PixelAnoNeLayout, padding, okraje
spScale-independent PixelAnoAnoVelikost textu

Vzorec převodu dp na px a zpět

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.

BucketDensityHodnota dpi48 dp v px16 dp v px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: centralizovaná správa rozměrů

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

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>

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.

Programové použití dp v Kotlin a XML

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.

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

XML soubory s 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"
/>

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.

Typické chyby při použití dp

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

  • px místo dp — aplikace vypadá na zařízeních s různou hustotou odlišně. Oprava: nahrazení px dp v XML.
  • Inline hodnoty — rozměry jsou zapsány přímo v layout souborech. Duplikování hodnot ztěžuje údržbu a aktualizaci.
  • sp pro text — použití dp pro velikost písma ignoruje uživatelská nastavení a porušuje přístupnost.
  • Celočíselné dělení — v Kotlin dělení Int Intem dává Int, ztrácí se zlomková část. Vždy používejte Float.

Často kladené otázky

Čím se liší dp od pt v iOS?

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

Jak převést dp na px v Jetpack Compose?

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

Je nutné používat dp v iOS?

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í

  • dp — Density-independent Pixel, abstraktní jednotka pro UI rozměry v Androidu, rovná 1/160 palce.
  • Vzorec: px = dp × (dpi / 160). Na mdpi 1 dp = 1 px, na xxhdpi 1 dp = 3 px.
  • Všechny rozměry v XML souborech musí být zadány v dp, velikost textu — v sp.
  • dimens.xml — centralizované úložiště rozměrů. Jedna změna aktualizuje celé rozhraní.
  • 8-point grid: všechny rozměry jsou násobky 8 dp, mezery textu — 4 sp.
  • V programovém kódu používejte TypedResource nebo rozšiřující funkce pro převod dp na px.

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

Prodiskutovat projekt

Přečtěte si také