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

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

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

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

Ответ 1

nodpi

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

Например:

  • 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) используется вектор.

Начальный ответ

Ниже я понял из описания изменений, но не то, как ведет себя мое устройство. Это может быть правильно для старых инструментов SDK.

nodpi

Не работает по назначению: однако nodpi не имеет приоритета. Например, если у вас есть

  • drawable- MDPI/eg.png
  • drawable- ИПЧР/eg.png
  • drawable- nodpi/eg.xml

Тогда

  • В mdpi фреймворк примет растровое изображение mdpi.
  • В xxxdpi инфраструктура примет растровое изображение hdpi.

Временное решение для векторных чертежей: если вы хотите использовать векторный чертеж, вам необходимо отправить:

  • drawable- MDPI/eg.png
  • drawable- MDPI/eg.xml
  • drawable- ИПЧР/eg.png
  • drawable- ИПЧР/eg.xml

anydpi

Добавлен изменить Ic3288d0236fe0bff20bb1599aba2582c25b0db32 квалификатор ресурса anydpi выбирается каркасом, если точный dpi не найден иначе.

Это огромно для тех, кто использует векторные чертежи.

Теперь, если у вас

  • drawable- MDPI/eg.png
  • drawable- ИПЧР/eg.png
  • drawable- anydpi/eg.xml

Тогда

  • В mdpi фреймворк примет растровое изображение mdpi.
  • В xxxdpi структура примет вектор. Забастовкa >

Ответ 2

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

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

Ответ 3

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

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