Яка різниця між -anydpi та -nodpi?


108

Якщо ви використовуєте майстра вектора активів в Android Studio 1.5.0, будь-який векторний XML, який ви можете імпортувати, використовує цей майстер res/drawable/.

Однак build/каталог і отриманий APK показують, що ці XML-файли переміщуються в res/drawable-anydpi-v21/каталог ресурсів. -v21Частина має сенс, тому що VectorDrawableпідтримується тільки на API рівня 21+. Однак, -anydpiздається, недокументований. Я б очікував -nodpi, як для оригінального пункту призначення імпорту, так і для того, де система збірки вирішить його перемістити.

Хтось бачив офіційні заяви про те, що -anydpiозначає, і які стосунки це -nodpi? Я шукаю практичні ефекти, а не лише те, на що натякають деякі коментарі до коду.


Відповіді:


106

нодпі

Це незалежні від щільності ресурси. Система не масштабує ресурси, позначені цим класифікатором, незалежно від щільності поточного екрану.

Наприклад:

  • drawable- nodpi /dot.png

Точка виявиться маленькою на xxhdpi, великою - на ldpi.

Однак вирішувач ресурсів буде відповідати конкретному класифікатору, якщо він існує.

Наприклад

  • drawable- ІПЧР /eg.png
  • drawable- nodpi -v21 / eg.xml

На пристрої hdpi Lollipop (API 21) використовується растрова карта .

На пристрої xhdpi Lollipop (API 21) використовується вектор.

anydpi

Ці ресурси мають перевагу в будь-якому dpi.

Наприклад

  • drawable- ІПЧР /eg.png
  • drawable- anydpi -v21 / eg.xml

На пристрої hdpi Lollipop (API 21) використовується вектор .

На пристрої xhdpi Lollipop (API 21) використовується вектор.

Довідково

Примітка : anydpi додано в зміну Ic3288d0236fe0bff20bb1599aba2582c25b0db32 .


Це не те, що я бачу. Цитуючи свою суму: "Враховуючи два видання одного і того ж ресурсу в res / dravable-nodpi / і res-dravable-mdpi /, я отримую res / dravable-nodpi / edition на Nexus 5 під управлінням Android 6.0, що є -xxhdpi пристрій ". Чи є у вас зразковий проект, який демонструє поведінку, яку ви цитуєте?
CommonsWare

Це тому, що ти звик drawable. Поведінка SDK може змінитися. Дивіться VectorDrawable: Android завантажує xhdpi PNG замість векторного ресурсу
rds

"Це тому, що ви використовували малювання" - так ви і у своїй відповіді. Кожен окремий каталог ресурсів, який ви цитуєте у своїй відповіді, - це drawableкаталог ресурсів, так само як обидва каталоги, які я цитував у своєму ряді, - це drawableкаталоги ресурсів.
CommonsWare

"На xxxdpi рамка буде приймати растровий файл hdpi." - це конкретно те, що не відбувається, хоча тестування на -xxhdpiпристрої. Я маю res/drawable-mdpi/nodpi_and_m.pngі res/drawable-nodpi/nodpi_and_m.xml. На пристрої Nexus 5 -xxhdpiвикористовується ресурс, який використовується res/drawable-nodpi/nodpi_and_m.xml. Відповідно до вашого алгоритму, і моїх очікувань, res/drawable-mdpi/nodpi_and_m.pngслід використовувати. Це не те, що відбувається.
CommonsWare

2
Підсумок: слід розмістити вектори drawable-anydpi-v21. Якщо у вас є бібліотека з підтримкою, яку можна переглядати векторно, ви можете розмістити їх у drawable-anydpiабо просто drawable.
rds

17

Вихідний код містить наступні коментарі (рядок 639):

/**
 * Value for {@link #densityDpi} for resources that scale to any density (vector drawables).
 * {@hide}
 */
public static final int DENSITY_DPI_ANY = 0xfffe;

/**
 * Value for {@link #densityDpi} for resources that are not meant to be scaled.
 * {@hide}
 */
public static final int DENSITY_DPI_NONE = 0xffff;

Сподіваюся, це очистить плутанину.


8
"Сподіваюсь, це очистить плутанину" - не дуже. Незрозуміло, яка різниця між "шкалою до будь-якої щільності" та "не призначеною для масштабування" означає на практиці. Малюнки в -nodpiкаталогах, безумовно, масштабуються залежно від розміру, відповідно до будь-яких правил щодо використання зображуваного рисунка .
CommonsWare

"Не призначений для масштабування" означає, що вони не будуть масштабовані незалежно від того, що робить програміст чи щільність.
Vishavjeet Singh

Я думаю, що вони мають на увазі під фразою "масштаб до будь-якої густини", що вони мають на увазі векторні малюнки, які будуть масштабуватися для будь-якої щільності, незалежно від того, наскільки щільна вона.
Vishavjeet Singh

3
його додано в android.googlesource.com/platform/frameworks/base/+/31245b4%5E! , і з нього можна дізнатися, ймовірно, виправлено якусь помилку 17007265
marcinj

1
@ MarcinJędrzejewski: Насправді, "вибираються як найкраща відповідність, якщо тільки немає конфігурації, яка б точно відповідала щільності, яку вимагає" коментар до цього комітету дає мені підказку. Дякую!
CommonsWare

10

nodpi: Ресурси для всіх густин. Це незалежні від щільності ресурси. Система не масштабує ресурси, позначені цим класифікатором, незалежно від щільності поточного екрану.

anydpi: Цей класифікатор відповідає всій щільності екрана і має перевагу перед іншими класифікаторами. Це корисно для векторних малюнків. Додано в API 21 рівень.


9

Я використовую Dravable-nodpi для всього, включаючи велику кількість графіки для своєї гри. Одним з незадокументованих наслідків збільшення масштабу вашої графіки є те, що вона збільшує використання пам'яті в експоненціальному масштабі. Отже, якщо у вас є графічний малюнок розміром 1 Мб, він буде масштабуватися до 4 МБ, 16 Мб або 64 Мб залежно від роздільної здатності пристрою користувача. І роздільна здатність пристрою не змінюється. Звичайно, масштабування насправді не збільшує чіткість графіки. Дії малювання можуть спрямовувати, якою має бути величина кожної графіки щодо розміру екрана в будь-якому випадку, не потрібно роздувати додаток кількома папками малювання.


3
занижена відповідь. Я зіткнувся з тією ж проблемою: мав зображення величиною 100 Кб, але часто мав помилки OOM при завантаженні. Додаток вийшов з ладу, заявивши, що він не може виділити 18 МБ !!! Не можу зрозуміти, як ці 100 КБ можна було перетворити на 18 МБ, але насправді це було результатом цього масштабування. Переключення зображення на no-dpi вирішило проблему.
Саймон Нінон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.