В чем разница между -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? Я ищу практические эффекты, а не просто то, на что намекают некоторые комментарии кода.

CommonsWare
источник

Ответы:

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 / drawable-nodpi / и res-drawable-mdpi /, я получаю res / drawable-nodpi / edition на Nexus 5 под управлением Android 6.0, который является -xxhdpi устройство ". У вас есть образец проекта, демонстрирующий поведение, которое вы цитируете?
CommonsWare,
Это потому, что вы использовали drawable. Поведение SDK может измениться. См. VectorDrawable: Android загружает PNG xhdpi вместо векторного ресурса
rds,
«Это потому, что вы использовали drawable» - вы тоже ответили. Каждый отдельный каталог ресурсов, который вы цитируете в своем ответе, является 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. Если у вас есть библиотека support-vector-drawable, вы можете разместить их в 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
«Не предназначено для масштабирования» означает, что они не будут масштабироваться независимо от того, что делает программист или какая плотность.
Вишавджит Сингх,
Я думаю, они подразумевают под фразой «масштабировать до любой плотности», что имеют в виду векторные чертежи, которые будут масштабироваться для соответствия любой плотности, независимо от того, насколько велика плотность.
Вишавджит Сингх
3
он был добавлен в android.googlesource.com/platform/frameworks/base/+/31245b4%5E! , и из него вы можете узнать, что, вероятно, исправлена ​​какая-то ошибка 17007265
marcinj
1
@ MarcinJędrzejewski: На самом деле, комментарий «выбраны как наилучшее соответствие, если нет конфигурации, которая точно соответствует запрошенной плотности» к этому коммиту дает мне подсказку. Спасибо!
CommonsWare
11

nodpi: Ресурсы для всех плотностей. Это ресурсы, не зависящие от плотности. Система не масштабирует ресурсы, помеченные этим квалификатором, независимо от плотности текущего экрана.

anydpi: Этот квалификатор соответствует любой плотности экрана и имеет приоритет над другими квалификаторами. Это полезно для векторных чертежей. Добавлено в API уровня 21.

Дзиковский
источник
9

Я использую drawable-nodpi для всего, включая большое количество крупной графики для моей игры. Одним из недокументированных последствий увеличения масштаба графики является экспоненциальное увеличение использования памяти. Таким образом, если у вас есть рисунок размером 1 МБ, доступный для рисования, он будет масштабирован до 4 МБ, 16 МБ или 64 МБ в зависимости от разрешения пользовательского устройства. И разрешения устройств продолжают расти. Конечно, это увеличение на самом деле не увеличивает резкость изображения. Действия рисования могут в любом случае определять, насколько большим должен быть каждый рисунок по отношению к размеру экрана, нет необходимости раздувать приложение несколькими папками для рисования.

Androidcoder
источник
3
недооцененный ответ. Я столкнулся с той же проблемой: у меня было изображение размером 100 КБ, но при его загрузке часто возникали ошибки OOM. Приложение вылетело, заявив, что не может выделить 18 МБ !!! Не мог понять, как эти 100 КБ можно было превратить в 18 МБ, но на самом деле это было результатом такого масштабирования. Переключение изображения на без dpi решило проблему.
Саймон Нинон