В чем разница между -anydpi и -nodpi?

Если вы используете мастер векторных активов в Android Studio 1.5.0, любой XML-файл векторной графики, который вы импортируете с помощью этого мастера, попадает в res/drawable/,

Тем не менее build/ каталог, и полученный APK показывает, что эти файлы XML перемещаются в res/drawable-anydpi-v21/ каталог ресурсов. -v21 часть имеет смысл, так как VectorDrawable поддерживается только на уровне API 21+. Тем не мение, -anydpi кажется недокументированным. Я бы ожидал -nodpiкак для исходного места назначения импорта, так и для места, где система сборки выбирает его перемещение.

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

4 ответа

Решение

nodpi

Это независимые от плотности ресурсы. Система не масштабирует ресурсы, помеченные этим классификатором, независимо от плотности текущего экрана.

Например:

  • drawable- nodpi /dot.png

Точка будет выглядеть маленькой на xxhdpi, большой на ldpi.

Однако распознаватель ресурсов будет соответствовать определенному квалификатору, если он существует.

Например

  • drawable- hdpi /eg.png
  • drawable- nodpi -v21 / eg.xml

На устройстве hdpi Lollipop (API 21) используется растровое изображение.

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

anydpi

Эти ресурсы имеют приоритет в любом dpi.

Например

  • drawable- hdpi /eg.png
  • drawable- anydpi -v21 / eg.xml

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

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

Ссылка

Примечание: anydpi было добавлено в изменение Ic3288d0236fe0bff20bb1599aba2582c25b0db32.

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

Исходный код содержит следующие комментарии (строка 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;

Надеюсь, что это устранит путаницу.

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

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

Другие вопросы по тегам