← Назад к вопросам

Что такое плотность экрана?

1.0 Junior🔥 221 комментариев
#Android компоненты#UI и вёрстка

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое плотность экрана в Android?

Плотность экрана (Screen Density) — это ключевое понятие в Android разработке, которое определяет количество пикселей (px) на физической площади экрана устройства. Она измеряется в пикселях на дюйм (DPI). Важно понимать, что DPI не является синонимом разрешения (общего количества пикселей) — это плотность их расположения.

Почему плотность важна?

Android устройства имеют огромное разнообразие экранов: от маленьких смартфонов до больших планшетов, с разными физическими размерами и разрешениями. Если разработчик будет использовать абсолютные значения в пикселях (px) для размеров UI элементов (например, Button шириной 100px), то на устройстве с высокой плотностью (например, 440 dpi) этот элемент будет выглядеть очень маленьким, а на устройстве с низкой плотностью (например, 160 dpi) — слишком большим. Это нарушает принцип визуальной консистенции приложения на разных устройствах.

Как Android классифицирует плотности?

Для удобства разработки Android группирует реальные плотности экранов в несколько базовых категорий плотности (Density Buckets). Это позволяет использовать условные единицы измерения, которые автоматически масштабируются.

// Пример объявления ресурсов для разных плотностей в структуре проекта:
res/
    drawable-mdpi/      // Для средней плотности (~160 dpi)
    drawable-hdpi/      // Для высокой плотности (~240 dpi)
    drawable-xhdpi/     // Для сверхвысокой плотности (~320 dpi)
    drawable-xxhdpi/    // Для двойной сверхвысокой (~480 dpi)
    drawable-xxxhdpi/   // Для тройной сверхвысокой (~640 dpi)

Основные категории (актуальные на сегодня):

  • ldpi (low) ~ 120 dpi – сейчас практически не встречается.
  • mdpi (medium) ~ 160 dpi – исторический «базовый» стандарт.
  • hdpi (high) ~ 240 dpi.
  • xhdpi (extra-high) ~ 320 dpi.
  • xxhdpi (extra-extra-high) ~ 480 dpi – наиболее распространенная сегодня.
  • xxxhdpi (extra-extra-extra-high) ~ 640 dpi.

Независимые от плотности пиксели (dp или dip)

Чтобы создать интерфейс, который выглядит одинаково на разных устройствах, Android использует специальную единицу измерения — dp (density-independent pixel, также иногда называют dip).

1 dp — это виртуальный пиксель, который при рендеринге на устройстве с базовой плотностью (mdpi, 160 dpi) равен 1 физическому пикселю (px). На устройствах с другой плотностью система автоматически масштабирует значение dp.

// Формула преобразования dp в px (и наоборот):
px = dp * (dpi / 160)
dp = px / (dpi / 160)

// Пример: Элемент шириной 100 dp на устройстве с xxhdpi (480 dpi)
// будет отрисован как:
// 100 dp * (480 dpi / 160) = 100 * 3 = 300 физических px.

В коде и ресурсах вы всегда должны использовать dp для размеров и sp для размеров текста (scale-independent pixel, который также учитывает пользовательские настройки масштаба текста).

<!-- Пример использования в XML layout файле -->
<Button
    android:layout_width="100dp" <!-- Ширина в dp -->
    android:layout_height="50dp"
    android:textSize="16sp" <!-- Размер текста в sp -->
    android:text="Click Me" />

Практические рекомендации для разработчика

  1. Всегда используйте dp и sp. Забудьте о px при описании размеров вьюшек, отступов (margin, padding) и текста.
  2. Подготовка графических ресурсов. Для обеспечения наилучшего качества изображений на экранах с высокой плотностью необходимо предоставить несколько версий графики (drawable) для основных категорий плотности. Идеальная практика — создать векторные ресурсы (VectorDrawable), которые масштабируются без потери качества на любой плотности.
  3. Тестирование на разных устройствах. Используйте эмуляторы или реальные устройства с разными плотностями (например, xxhdpi и mdpi) для проверки, что ваш интерфейс не «разваливается».
  4. Учет плотности в програмном коде. Если вам в редких случаях нужно получить физические пиксели (например, для некоторых графических операций), используйте класс DisplayMetrics.
// Пример получения плотности экрана и конвертации dp в px в коде:
val displayMetrics = resources.displayMetrics
val densityDpi = displayMetrics.densityDpi // Реальная плотность в dpi
val density = displayMetrics.density // Коэффициент масштаба (dpi/160)

// Конвертация 100 dp в px для текущего устройства:
val pxValue = 100 * density

Понимание и правильное использование концепции плотности экрана — фундамент для создания адаптивных и качественных интерфейсов в Android, которые одинаково хорошо воспринимаются пользователями на любом устройстве из огромного многообразия Android экосистемы.