Обясняваме същността на 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, което отговаря на buckets 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 отразяваше 1.5-кратно или двойно увеличение на плътността спрямо предходния. Според 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също