Screen Density: розуміння щільності пікселів в Android

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

Пояснюємо суть 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). Android групує екрани в Density Buckets: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi.
  • Базовий bucket — mdpi (160 dpi). Всі інші обчислюються відносно нього: hdpi = 1.5×, xhdpi = 2×, xxhdpi = 3×, xxxhdpi = 4×.
  • Ресурси для різних щільностей зберігаються в кваліфікованих папках res/drawable-{density}.
  • За даними Android Studio (2025), найпоширеніша щільність на сучасних пристроях — xxhdpi (420+ dpi, 3×).
  • Screen Density не залежить від роздільної здатності екрана — два пристрої з однаковою роздільною здатністю можуть мати різну щільність.

Що таке Screen Density?

Screen Density — це кількість фізичних пікселів на дюйм екрана (ppi — пікселі на дюйм, або dpi — точки на дюйм). Android використовує поняття Density Buckets — групи екранів з подібною щільністю, для яких застосовуються однакові коефіцієнти масштабування. На відміну від роздільної здатності (кількість пікселів по ширині та висоті), щільність визначає фізичний розмір пікселя на екрані. За даними Google Pixel Team (2025), щільність сучасних флагманів становить 450-550 ppi, що відповідає bucket xxhdpi-xxxhdpi.

Історія та еволюція Density Buckets

Система 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: mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi

Density Buckets — це діапазони щільності, визначені Google для групування екранів Android. Базовий bucket — mdpi (160 dpi). Коефіцієнт масштабування показує, у скільки разів ресурс для даного bucket більший, ніж для mdpi. Наприклад, xhdpi (2×) означає, що зображення повинно бути в 2 рази більше по ширині та висоті, ніж його mdpi-версія. За даними Android Studio Resource Manager (2025), xxhdpi є найпоширенішим bucket серед активних пристроїв (38% ринку), за ним слідує xhdpi (28%).

BucketДіапазон DPIМасштабПриклад пристроюЧастка ринку (2025)
ldpi120 dpi0.75×Старі бюджетні пристроїМенше 1%
mdpi120-160 dpiHTC Dream (G1), планшети 7"3%
hdpi160-240 dpi1.5×Samsung Galaxy S2, Nexus 412%
xhdpi240-320 dpiGoogle Nexus 5, Moto G28%
xxhdpi320-480 dpiSamsung Galaxy S8, Pixel 338%
xxxhdpi480-640 dpiSamsung Galaxy S24 Ultra, Pixel 9 Pro18%

Щільність пікселів vs роздільна здатність екрана: у чому різниця

Роздільна здатність екрана — це загальна кількість пікселів по ширині та висоті (наприклад, 1080×2400). Щільність екрана — кількість пікселів на дюйм. Два пристрої з однаковою роздільною здатністю можуть мати різну щільність, якщо відрізняються фізичні розміри екрана. Наприклад, 6-дюймовий телефон з роздільною здатністю 1080×2400 має щільність близько 440 dpi (xxhdpi), а 5-дюймовий з тією ж роздільною здатністю — близько 530 dpi (xxxhdpi). Це ключова відмінність: інтерфейс повинен адаптуватися не до роздільної здатності, а до щільності, інакше елементи будуть надто дрібними на пристроях з високою щільністю.

Ресурсні кваліфікатори щільності в Android

Android використовує кваліфікатори в іменах папок res для завантаження ресурсів під конкретну щільність екрана: drawable-mdpi, drawable-hdpi, drawable-xhdpi, drawable-xxhdpi, drawable-xxxhdpi. При запуску додатку Android вибирає ресурси з папки, яка найкраще підходить під щільність пристрою. Якщо точного збігу немає, система бере найближчий bucket або масштабує ресурс з більш низької щільності. За даними Android Docs (2025), для векторів (VectorDrawable) кваліфікатори щільності не потрібні — вони масштабуються автоматично.

XML

/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 множиться на коефіцієнт масштабування для кожного bucket. Android автоматично вибирає потрібний файл на основі DisplayMetrics.density пристрою. Для VectorDrawable (формат XML) достатньо одного файлу в drawable/ — система масштабує його без втрати якості.

Розрахунок пікселів для кожної щільності

Розрахунок розміру зображення для кожної щільності заснований на простій формулі: розмір в mdpi × коефіцієнт масштабування. Якщо іконка в 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МасштабРозмір mdpi (px)Розмір у bucket (px)
mdpi48×4848×48
hdpi1.5×48×4872×72
xhdpi48×4896×96
xxhdpi48×48144×144
xxxhdpi48×48192×192

Найкращі практики підготовки ресурсів для всіх щільностей

Правильна підготовка ресурсів для Density Buckets включає п'ять ключових правил. По-перше, використовуйте VectorDrawable для простих іконок — це усуває необхідність у п'яти копіях. По-друге, для растрових зображень експортуйте з дизайн-інструментів відразу всі щільності (Android Studio Asset Studio генерує автоматично). По-третє, уникайте розміщення зображень у drawable/ без кваліфікатора — система буде масштабувати з втратою якості. По-четверте, тестуйте на пристрої з щільністю, відмінною від вашої основної — емулятор дозволяє змінювати щільність. По-п'яте, використовуйте WebP замість PNG — за даними Google (2025), WebP дає на 25-35% менший розмір при тій же якості.

  • VectorDrawable — найкращий формат для іконок і простих ілюстрацій. Один XML-файл замінює 5 PNG.
  • Android Studio Asset Studio — автоматична генерація ресурсів для всіх щільностей з SVG або PNG.
  • WebP без втрат — оптимальний формат для фотографій. Розмір на 30% менший за PNG без втрати якості.
  • 9-patch — для масштабованих фонів. Один файл працює на всіх щільностях при правильному налаштуванні stretch-областей.
  • Adaptive Icons — формат іконок для API 26+. Дозволяє задати передній план і фон окремо для різних щільностей.

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

Що означає mdpi в Android?

mdpi (medium-density pixel-independent) — базовий Density Bucket Android з щільністю 160 dpi. Всі інші buckets розраховуються відносно mdpi: hdpi — 1.5×, xhdpi — 2× і так далі. mdpi відповідає одному фізичному пікселю на один density-independent pixel (dp). Саме на mdpi орієнтуються дизайнери при створенні макетів.

Як дізнатися щільність екрана пристрою Android?

Використовуйте DisplayMetrics: getResources().getDisplayMetrics().density повертає коефіцієнт масштабування (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 достатньо одного файлу без кваліфікатора.

Підсумки

  • Screen Density — кількість фізичних пікселів на дюйм (dpi/ppi). Android групує екрани в Density Buckets: mdpi (1×), hdpi (1.5×), xhdpi (2×), xxhdpi (3×), xxxhdpi (4×).
  • Базовий bucket mdpi = 160 dpi. Всі інші розраховуються як mdpi × коефіцієнт масштабування.
  • Ресурси для різних щільностей зберігаються в кваліфікованих папках res/drawable-{bucket}.
  • xxhdpi — найпоширеніший bucket (38%), за ним xhdpi (28%) та xxxhdpi (18%).
  • VectorDrawable замінює 5 растрових файлів і масштабується без втрати якості.
  • Використовуйте WebP замість PNG для економії 30% трафіку та місця.

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

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

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

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