dp — основи, щільнісно-незалежні пікселі в Android

Автор: IT Sectr Опубліковано: 2026-02-25 Час читання: 7 хв

Пояснюємо основи dp (щільнісно-незалежний піксель) — одиниця виміру в Android, яка забезпечує однаковий фізичний розмір UI-елементів на екранах з різною щільністю пікселів. Один dp завжди відповідає 1/160 дюйма на екрані, незалежно від того, наскільки високу чи низьку роздільну здатність має пристрій. За даними Google Material Design (2025), всі розміри в Android-додатках повинні задаватися в dp, а не в px, інакше інтерфейс виглядатиме по-різному на різних пристроях.

Головне

  • dp (щільнісно-незалежний піксель) — абстрактна одиниця виміру в Android, що дорівнює 1/160 дюйма на екрані.
  • Формула переведення: px = dp × (dpi / 160). На mdpi-екрані 1 dp = 1 px, на xxhdpi 1 dp = 3 px.
  • Всі розміри в XML-розмітці (layout_width, padding, margin) задаються в dp.
  • dimens.xml — файл ресурсів Android для централізованого зберігання значень dp.
  • За даними Google Android Performance Guide (2025), використання dp замість px усуває 90% проблем з адаптацією інтерфейсу на різних екранах.

Що таке dp в Android?

dp (щільнісно-незалежний піксель) — це віртуальна одиниця виміру в Android, введена для уніфікації розмірів UI-елементів на пристроях з різною щільністю пікселів. Один dp приблизно дорівнює одному фізичному пікселю на екрані зі щільністю 160 dpi (mdpi). На екрані зі щільністю 320 dpi (xhdpi) 1 dp дорівнює 2 фізичним пікселям. Таким чином, фізичний розмір елемента на екрані залишається однаковим — близько 1/160 дюйма. За даними Android Developers (2025), dp — єдина одиниця виміру, яку слід використовувати для розмірів layout, padding, margin та ширини/висоти view.

Чому не можна використовувати px

Якщо задати кнопці ширину 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: у чому різниця

dp, px та sp — три одиниці виміру в Android, кожна зі своїм призначенням. px — фізичний піксель екрана, який залежить від щільності. dp — щільнісно-незалежний піксель для розмірів елементів. sp — масштабно-незалежний піксель для тексту, який додатково враховує системні налаштування розміру шрифту. За даними Material Design (2025), різниця між dp та sp — ключовий момент доступності: користувачі з поганим зором збільшують шрифт, і sp-значення автоматично підлаштовуються, а dp — ні.

ОдиницяПовна назваВраховує щільністьВраховує налаштування шрифтуЗастосування
pxПіксельНіНіНе рекомендується
dpЩільнісно-незалежний піксельТакНіLayout, padding, margins
spМасштабно-незалежний піксельТакТакРозмір тексту

Формула переведення dp в px і назад

Формула переведення 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 (point) в dp — 1 pt ≈ 1 dp.

BucketЩільністьЗначення dpi48 dp в px16 dp в px
mdpi1.01604816
hdpi1.52407224
xhdpi2.03209632
xxhdpi3.048014448
xxxhdpi4.064019264

dimens.xml: централізоване керування розмірами

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.

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>

У цьому файлі кожен 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.

Програмне використання dp в Kotlin та XML

В XML-розмітці dp використовується безпосередньо: android:layout_width="48dp". У програмному коді (Kotlin/Java) необхідно конвертувати dp в px за допомогою TypedResource або extension-функцій. TypedResource надає готові методи для роботи з dp в рантаймі: getDimensionPixelSize() повертає ціле число px. В Jetpack Compose dp — стандартна одиниця виміру в модифікаторах та layout-контейнерах.

Kotlin
// Конвертація 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 на етапі відтворення.

XML-розмітка з 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"
/>

В XML dp вказується як суфікс до числа — margin_top="16dp". Для тексту використовується sp — textSize="@dimen/text_size_body". Посилання @dimen дозволяє централізовано керувати значеннями. Використання match_parent для ширини та 48dp для висоти — стандартний патерн Material Design для кнопок.

Типові помилки при використанні dp

За даними аналізу Android-додатків від Google Play Console (2025), п'ять найчастіших помилок: використання px замість dp в XML-розмітці, відсутність dimens.xml (значення прописані inline), невірне переведення dp в px в коді (використання цілочисельного ділення), ігнорування sp для тексту та неврахування системних налаштувань розміру шрифту через sp. Цілочисельне ділення — найнебезпечніша помилка: в Kotlin val px = dp * density — якщо dp та density — Int, результат теж буде Int, і точність втрачається.

  • px замість dp — додаток виглядає по-різному на пристроях з різною щільністю. Виправляється заміною px на dp в XML.
  • Inline-значення — розміри вписані прямо в layout-файли. Дублювання значень ускладнює підтримку та оновлення.
  • sp для тексту — використання dp для розміру шрифту ігнорує налаштування користувача, порушуючи доступність.
  • Цілочисельне ділення — в Kotlin ділення Int на Int дає Int, втрачаючи дробову частину. Завжди використовуйте Float.

Часті запитання

Чим dp відрізняється від pt в iOS?

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

Як перевести dp в px в Jetpack Compose?

В Jetpack Compose конвертація не потрібна — dp вбудовано в систему типів. Всі модифікатори та layout приймають Dp, а не px. Якщо потрібно отримати px з dp, використовуйте density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity надає коефіцієнт переведення, що враховує щільність екрану пристрою.

Чи потрібно використовувати dp в iOS?

dp — Android-термін. В iOS аналогом є pt (points). Swift автоматично працює з точками, які не залежать від щільності екрану. В UIKit та SwiftUI всі розміри задаються в точках, а система перетворює їх в px за допомогою scale factor екрану (UIScreen.main.scale). Принцип той самий, назва інша.

Підсумки

  • dp — щільнісно-незалежний піксель, абстрактна одиниця для розмірів UI в Android, що дорівнює 1/160 дюйма.
  • Формула: px = dp × (dpi / 160). На mdpi 1 dp = 1 px, на xxhdpi 1 dp = 3 px.
  • Всі розміри в XML-розмітці повинні задаватися в dp, розмір тексту — в sp.
  • dimens.xml — централізоване зберігання розмірів. Одна зміна оновлює весь інтерфейс.
  • 8-point grid: всі розміри кратні 8 dp, текстові відступи — 4 sp.
  • У програмному коді використовуйте TypedResource або extension-функції для конвертації dp в px.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект

Читайте також