J'essaie d'utiliser des dessins vectoriels dans mon application Android. De http://developer.android.com/training/material/drawables.html (c'est moi qui souligne):
Dans Android 5.0 (niveau d'API 21) et au-dessus, vous pouvez définir des dessins vectoriels, qui sont mis à l'échelle sans perdre la définition.
En utilisant ce dessinable:
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:height="24dp"
android:width="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path android:fillColor="@color/colorPrimary" android:pathData="M14,20A2,2 0 0,1 12,22A2,2 0 0,1 10,20H14M12,2A1,1 0 0,1 13,3V4.08C15.84,4.56 18,7.03 18,10V16L21,19H3L6,16V10C6,7.03 8.16,4.56 11,4.08V3A1,1 0 0,1 12,2Z" />
et cette ImageView:
<ImageView
android:layout_width="400dp"
android:layout_height="400dp"
android:src="@drawable/icon_bell"/>
produit cette image floue en essayant d'afficher l'icône à 400dp (sur un gros appareil mobile haute résolution d'environ 2015 exécutant une sucette):
La modification de la largeur et de la hauteur dans la définition du vecteur dessinable à 200dp améliore considérablement la situation à la taille de rendu de 400dp. Cependant, le définir comme dessinable pour un élément TextView (c'est-à-dire l'icône à gauche du texte) crée maintenant une énorme icône.
Mes questions:
1) Pourquoi y a-t-il une spécification de largeur / hauteur dans le dessin vectoriel? Je pensais que le point entier de ceux-ci est qu'ils augmentent et diminuent sans perte de sens, ce qui rend la largeur et la hauteur dénuées de sens dans sa définition?
2) Est-il possible d'utiliser un seul vecteur dessinable qui fonctionne comme un dessin 24dp sur un TextView mais qui s'adapte bien pour utiliser des images beaucoup plus grandes? Par exemple, comment éviter de créer plusieurs dessins vectoriels de tailles différentes et en utiliser un qui s'adapte à mes exigences de rendu?
3) Comment utiliser efficacement les attributs width / height et quelle est la différence avec viewportWidth / Height?
Détails supplémentaires:
- L'appareil exécute l'API 22
- Utilisation d'Android Studio v1.5.1 avec Gradle version 1.5.0
- Le manifeste est le niveau de compilation et cible 23, le niveau minimum 15. J'ai également essayé de déplacer le niveau minimum à 21, mais cela n'a fait aucune différence.
- La décompilation de l'APK (avec un niveau minimum défini sur 21) affiche une seule ressource XML dans le dossier dessinable. Aucune image tramée n'est produite.
drawable
dossier. La largeur / hauteur dans le fichier xml dessinable vectoriel est de 24dp. Spécifier un ImageView d'une hauteur / largeur de 400 dpi crée définitivement une image mal mise à l'échelle.
drawable-anydpi-v21
est que mon minSdkVersion
est inférieur à 21. Y a-t-il un changement de comportement si vous définissez le minSdkVersion
sur moins de 21? Qu'en est-il du déplacement du XML vers drawable-anydpi
? Je ne m'attendrais pas à ce qu'il y ait un changement, mais je m'attendrais également à ce que votre image vectorielle soit mise à l'échelle correctement ...
drawable-anydpi-v21
avec diverses images pixellisées dans le fichier mdi / hdpi / etc. Dossiers. Aucun changement au résultat final rendu cependant.
New -> Vector Asset
je le choisis , le fichier XML d'image vectorielle est déposé dans mon dossier dessinable. Cependant, si j'utilise apktool pour décompresser l'APK qui est construit, je vois que les fichiers XML sontdrawable-anydpi-v21
et évoluent correctement sur les appareils API 21+. Les fichiers raster sont placés dans lesdrawable-<mdpi/hdpi/etc>-v4
dossiers et ne sont pas utilisés sur les appareils API 21+ (en fonction du fait qu'ils sont mis à l' échelle correctement)