Рассказываем, в чём суть Screen Density (Density Buckets) в Android — классификация экранов по плотности пикселей: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi. Screen Density определяет, сколько физических пикселей умещается в одном дюйме экрана, и напрямую влияет на то, как изображения и интерфейс отображаются на разных устройствах. По данным Google Android Compatibility Definition (2025), Android поддерживает 6 основных Density Buckets и до 8 дополнительных для складных устройств.
Главное
Screen Density (плотность экрана) — это количество физических пикселей, приходящихся на один дюйм экрана (ppi — pixels per inch, или dpi — dots per inch). Android использует понятие Density Buckets — группы экранов со схожей плотностью, для которых применяются одни и те же коэффициенты масштабирования. В отличие от разрешения (количество пикселей по ширине и высоте), плотность определяет физический размер пикселя на экране. По данным Google Pixel Team (2025), плотность современных флагманов составляет 450-550 ppi, что соответствует bucket xxhdpi-xxxhdpi.
Система Density Buckets появилась в Android 1.6 Donut (2009) с первыми устройствами на 160 dpi (mdpi). С ростом разрешения экранов добавлялись новые buckets: hdpi (Android 1.6), xhdpi (Android 2.3), xxhdpi (Android 4.1), xxxhdpi (Android 4.4). Каждый новый bucket отражал полуторный или двойной рост плотности относительно предыдущего. По данным Android Open Source Project (2025), сейчас 96% активных устройств Android имеют плотность от hdpi до xxxhdpi.
Density Buckets — это диапазоны плотности, определённые Google для группировки экранов Android. Базовый bucket — mdpi (160 dpi). Коэффициент масштабирования (scale factor) показывает, во сколько раз ресурс для данного bucket больше, чем для mdpi. Например, xhdpi (2×) означает, что изображение должно быть в 2 раза больше по ширине и высоте, чем его mdpi-версия. По данным Android Studio Resource Manager (2025), xxhdpi является наиболее распространённым bucket среди активных устройств (38% рынка), за ним следует xhdpi (28%).
| Bucket | DPI диапазон | Scale | Пример устройства | Доля рынка (2025) |
|---|---|---|---|---|
| ldpi | 120 dpi | 0.75× | Старые бюджетные устройства | Менее 1% |
| mdpi | 120-160 dpi | 1× | HTC Dream (G1), планшеты 7" | 3% |
| hdpi | 160-240 dpi | 1.5× | Samsung Galaxy S2, Nexus 4 | 12% |
| xhdpi | 240-320 dpi | 2× | Google Nexus 5, Moto G | 28% |
| xxhdpi | 320-480 dpi | 3× | Samsung Galaxy S8, Pixel 3 | 38% |
| xxxhdpi | 480-640 dpi | 4× | Samsung Galaxy S24 Ultra, Pixel 9 Pro | 18% |
Разрешение экрана — это общее количество пикселей по ширине и высоте (например, 1080×2400). Плотность экрана — количество пикселей на дюйм. Два устройства с одинаковым разрешением могут иметь разную плотность, если отличаются физические размеры экрана. Например, 6-дюймовый телефон с разрешением 1080×2400 имеет плотность около 440 dpi (xxhdpi), а 5-дюймовый с тем же разрешением — около 530 dpi (xxxhdpi). Это ключевое различие: интерфейс должен адаптироваться не к разрешению, а к плотности, иначе элементы будут слишком мелкими на устройствах с высокой плотностью.
Android использует qualifiers в именах папок res для загрузки ресурсов под конкретную плотность экрана: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. При запуске приложения Android выбирает ресурсы из папки, наиболее подходящей под плотность устройства. Если точного совпадения нет, система берёт ближайший bucket или масштабирует ресурс из более низкой плотности. По данным Android Docs (2025), для векторов (VectorDrawable) квалификаторы плотности не нужны — они масштабируются автоматически.
/res/
drawable-mdpi/
icon_app.png (48x48 px)
drawable-hdpi/
icon_app.png (72x72 px)
drawable-xhdpi/
icon_app.png (96x96 px)
drawable-xxhdpi/
icon_app.png (144x144 px)
drawable-xxxhdpi/
icon_app.png (192x192 px)
В этой структуре каждая папка содержит одну и ту же иконку, но в разном физическом размере в пикселях. Базовый размер 48×48 пикселей для mdpi умножается на scale factor для каждого bucket. Android автоматически выбирает нужный файл на основе DisplayMetrics.density устройства. Для VectorDrawable (формат XML) достаточно одного файла в drawable/ — система масштабирует его без потери качества.
Расчёт размера изображения для каждой плотности основан на простой формуле: размер в mdpi × scale factor. Если иконка в mdpi имеет размер 48×48 px, то для hdpi она будет 72×72 px (48 × 1.5), для xhdpi — 96×96 px (48 × 2), для xxhdpi — 144×144 px (48 × 3), для xxxhdpi — 192×192 px (48 × 4). По данным Material Design Guidelines (2025), эта формула применяется для всех растровых ресурсов: иконок, фонов, изображений и 9-patch.
| Bucket | Scale | Размер mdpi (px) | Размер в bucket (px) |
|---|---|---|---|
| mdpi | 1× | 48×48 | 48×48 |
| hdpi | 1.5× | 48×48 | 72×72 |
| xhdpi | 2× | 48×48 | 96×96 |
| xxhdpi | 3× | 48×48 | 144×144 |
| xxxhdpi | 4× | 48×48 | 192×192 |
Правильная подготовка ресурсов для Density Buckets включает пять ключевых правил. Во-первых, используйте VectorDrawable для простых иконок — это устраняет необходимость в пяти копиях. Во-вторых, для растровых изображений экспортируйте из дизайн-инструментов сразу все плотности (Android Studio Asset Studio генерирует автоматически). В-третьих, избегайте помещения изображений в drawable/ без квалификатора — система будет масштабировать с потерей качества. В-четвёртых, тестируйте на устройстве с плотностью, отличной от вашего основного — эмулятор позволяет менять плотность. В-пятых, используйте WebP вместо PNG — по данным Google (2025), WebP даёт на 25-35% меньший размер при том же качестве.
Часто задаваемые вопросы
mdpi (medium-density pixel-independent) — базовый Density Bucket Android с плотностью 160 dpi. Все остальные buckets рассчитываются относительно mdpi: hdpi — 1.5×, xhdpi — 2× и так далее. mdpi соответствует одному физическому пикселю на один density-independent pixel (dp). Именно на mdpi ориентируются дизайнеры при создании макетов.
Используйте DisplayMetrics: getResources().getDisplayMetrics().density возвращает scale factor (1.0 для mdpi, 3.0 для xxhdpi). Для программного определения bucket вызовите getResources().getConfiguration().densityDpi. В Android Studio также есть Device Explorer, показывающий densityDpi для подключённого устройства.
Технически — да, но с потерей качества. Если ресурс есть только в drawable-xxhdpi, на устройстве mdpi он будет уменьшен в 3 раза — изображение станет размытым. Если ресурс только в mdpi, на xxhdpi он будет увеличен — пикселизация. Рекомендуется готовить минимум для xhdpi, xxhdpi и xxxhdpi — это покрывает 84% активных устройств (2025). Для VectorDrawable достаточно одного файла без квалификатора.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также