web-dev-qa-db-fra.com

Quelle est la différence entre -anydpi et -nodpi?

Si vous utilisez l'assistant de parc vectoriel dans Android Studio 1.5.0, tout fichier XML dessinable au vecteur que vous importez à l'aide de cet assistant se place dans res/drawable/.

Toutefois, le répertoire build/ et le fichier APK résultant indiquent que ces fichiers XML sont déplacés dans un répertoire de ressources res/drawable-anydpi-v21/. La partie -v21 est logique, car VectorDrawable n'est pris en charge que par l'API de niveau 21+. Cependant, -anydpi ne semble pas être documenté. Je me serais attendu à -nodpi, à la fois pour la destination d'importation initiale et pour l'endroit où le système de génération choisit de le déplacer.

Quelqu'un a-t-il déjà vu des déclarations officielles sur ce que -anydpi signifie et quelle est sa relation avec -nodpi? Je cherche des effets pratiques, pas simplement ce que certains commentaires de code suggèrent.

97
CommonsWare

nodpi

Ce sont des ressources indépendantes de la densité. Le système ne met pas à l'échelle les ressources marquées avec ce qualificatif, quelle que soit la densité de l'écran actuel.

Par exemple:

  • drawable - nodpi /dot.png

Le point apparaîtra petit sur xxhdpi, grand sur ldpi.

Cependant, le résolveur de ressources correspondra à un qualificatif spécifique s'il existe.

Par exemple

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

Sur un périphérique hdpi Lollipop (API 21), le bitmap est utilisé.

Sur un périphérique xhdpi Lollipop (API 21), le vecteur est utilisé.

anydpi

Ces ressources sont prioritaires dans tous les dpi.

Par exemple

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

Sur un périphérique hdpi Lollipop (API 21), le vecteur est utilisé.

Sur un périphérique xhdpi Lollipop (API 21), le vecteur est utilisé.

Référence

Note : anydpi a été ajouté dans modification Ic3288d0236fe0bff20bb1599aba2582c25b0db32 .

92
rds

Le code source contient les commentaires suivants (ligne 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;

J'espère que cela efface la confusion.

15
Vishavjeet Singh

nodpi: Ressources pour toutes les densités. Ce sont des ressources indépendantes de la densité. Le système ne met pas à l'échelle les ressources marquées avec ce qualificatif, quelle que soit la densité de l'écran actuel.

anydpi: ce qualificatif correspond à toutes les densités d'écran et prime sur les autres qualificatifs. Ceci est utile pour les drawables vectoriels. Ajouté dans l'API niveau 21.

8
dzikovskyy

J'utilise drawable-nodpi pour tout, et j'ai beaucoup de gros graphismes. Une conséquence non documentée de la "mise à l'échelle" de vos graphiques est qu'elle augmente l'utilisation de la mémoire de manière exponentielle. Donc, si vous avez un graphique de 100 M en 'dessinable', il sera mis à l'échelle à 400 M ou 1,6 G selon la résolution de la machine utilisateur. Et les résolutions de périphériques ne cessent d'augmenter. Cette mise à l'échelle n'augmente pas la "netteté" des graphiques, bien sûr. Les actions de dessin peuvent quand même indiquer la taille des graphiques par rapport à la taille de l'écran, inutile de surcharger l'application avec plusieurs dossiers de dessin.

7
Androidcoder