Объясняем основы dp (density-independent pixel) — единица измерения в Android, которая обеспечивает одинаковый физический размер UI-элементов на экранах с разной плотностью пикселей. Один dp всегда соответствует 1/160 дюйма на экране, независимо от того, насколько устройство имеет высокое или низкое разрешение. По данным Google Material Design (2025), все размеры в Android-приложениях должны задаваться в dp, а не в px, иначе интерфейс будет выглядеть по-разному на разных устройствах.
Главное
dp (density-independent pixel) — это виртуальная единица измерения в 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 — scale-independent pixel для текста, который дополнительно учитывает системные настройки размера шрифта. По данным Material Design (2025), разница между dp и sp — ключевой момент доступности: пользователи с плохим зрением увеличивают шрифт, и sp-значения автоматически подстраиваются, а dp — нет.
| Единица | Полное название | Учитывает плотность | Учитывает настройки шрифта | Применение |
|---|---|---|---|---|
| px | Pixel | Нет | Нет | Не рекомендуется |
| dp | Density-independent Pixel | Да | Нет | Layout, padding, margins |
| sp | Scale-independent Pixel | Да | Да | Размер текста |
Формула перевода 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 (points) в dp — 1 pt ≈ 1 dp.
| Bucket | Density | 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". Cсылка @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. Оба понятия описывают density-independent точки: на старых устройствах с низкой плотностью 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 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также