Пояснюємо основи dp (щільнісно-незалежний піксель) — одиниця виміру в Android, яка забезпечує однаковий фізичний розмір UI-елементів на екранах з різною щільністю пікселів. Один dp завжди відповідає 1/160 дюйма на екрані, незалежно від того, наскільки високу чи низьку роздільну здатність має пристрій. За даними Google Material Design (2025), всі розміри в Android-додатках повинні задаватися в dp, а не в px, інакше інтерфейс виглядатиме по-різному на різних пристроях.
Головне
dp (щільнісно-незалежний піксель) — це віртуальна одиниця виміру в Android, введена для уніфікації розмірів UI-елементів на пристроях з різною щільністю пікселів. Один dp приблизно дорівнює одному фізичному пікселю на екрані зі щільністю 160 dpi (mdpi). На екрані зі щільністю 320 dpi (xhdpi) 1 dp дорівнює 2 фізичним пікселям. Таким чином, фізичний розмір елемента на екрані залишається однаковим — близько 1/160 дюйма. За даними Android Developers (2025), dp — єдина одиниця виміру, яку слід використовувати для розмірів layout, padding, margin та ширини/висоти view.
Якщо задати кнопці ширину 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 — три одиниці виміру в Android, кожна зі своїм призначенням. px — фізичний піксель екрана, який залежить від щільності. dp — щільнісно-незалежний піксель для розмірів елементів. sp — масштабно-незалежний піксель для тексту, який додатково враховує системні налаштування розміру шрифту. За даними Material Design (2025), різниця між dp та sp — ключовий момент доступності: користувачі з поганим зором збільшують шрифт, і sp-значення автоматично підлаштовуються, а dp — ні.
| Одиниця | Повна назва | Враховує щільність | Враховує налаштування шрифту | Застосування |
|---|---|---|---|---|
| px | Піксель | Ні | Ні | Не рекомендується |
| dp | Щільнісно-незалежний піксель | Так | Ні | Layout, padding, margins |
| sp | Масштабно-незалежний піксель | Так | Так | Розмір тексту |
Формула переведення 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 | Щільність | Значення dpi | 48 dp в px | 16 dp в 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 — файл ресурсів 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.
<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.
В XML-розмітці dp використовується безпосередньо: android:layout_width="48dp". У програмному коді (Kotlin/Java) необхідно конвертувати dp в px за допомогою TypedResource або extension-функцій. TypedResource надає готові методи для роботи з dp в рантаймі: getDimensionPixelSize() повертає ціле число px. В Jetpack Compose dp — стандартна одиниця виміру в модифікаторах та layout-контейнерах.
// Конвертація 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 на етапі відтворення.
<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 для кнопок.
За даними аналізу Android-додатків від Google Play Console (2025), п'ять найчастіших помилок: використання px замість dp в XML-розмітці, відсутність dimens.xml (значення прописані inline), невірне переведення dp в px в коді (використання цілочисельного ділення), ігнорування sp для тексту та неврахування системних налаштувань розміру шрифту через sp. Цілочисельне ділення — найнебезпечніша помилка: в Kotlin val px = dp * density — якщо dp та density — Int, результат теж буде Int, і точність втрачається.
Часті запитання
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%.
В Jetpack Compose конвертація не потрібна — dp вбудовано в систему типів. Всі модифікатори та layout приймають Dp, а не px. Якщо потрібно отримати px з dp, використовуйте density: val px = with(LocalDensity.current) { 16.dp.toPx() }. LocalDensity надає коефіцієнт переведення, що враховує щільність екрану пристрою.
dp — Android-термін. В iOS аналогом є pt (points). Swift автоматично працює з точками, які не залежать від щільності екрану. В UIKit та SwiftUI всі розміри задаються в точках, а система перетворює їх в px за допомогою scale factor екрану (UIScreen.main.scale). Принцип той самий, назва інша.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.