Пояснюємо суть 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 — пікселі на дюйм, або dpi — точки на дюйм). 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). Коефіцієнт масштабування показує, у скільки разів ресурс для даного bucket більший, ніж для mdpi. Наприклад, xhdpi (2×) означає, що зображення повинно бути в 2 рази більше по ширині та висоті, ніж його mdpi-версія. За даними Android Studio Resource Manager (2025), xxhdpi є найпоширенішим bucket серед активних пристроїв (38% ринку), за ним слідує xhdpi (28%).
| Bucket | Діапазон DPI | Масштаб | Приклад пристрою | Частка ринку (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 використовує кваліфікатори в іменах папок 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 множиться на коефіцієнт масштабування для кожного 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) |
|---|---|---|---|
| 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 повертає коефіцієнт масштабування (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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.