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.
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)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 monminSdkVersion
est inférieur à 21. Y a-t-il un changement de comportement si vous définissez leminSdkVersion
sur moins de 21? Qu'en est-il du déplacement du XML versdrawable-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.Réponses:
Il y a de nouvelles informations sur ce problème ici:
https://code.google.com/p/android/issues/detail?id=202019
Il semble que l'utilisation du logiciel
android:scaleType="fitXY"
le fasse évoluer correctement sur Lollipop.D'un ingénieur Google:
la source
Pour les versions de SDK inférieures à 21 où le système de construction doit générer des images raster et comme taille par défaut dans les cas où vous ne spécifiez pas la largeur / hauteur.
Je ne pense pas que cela soit possible si vous devez également cibler des SDK inférieurs à 21.
Documentation: (en fait pas très utile maintenant que je l'ai relue ...)
Plus de documentation:
Edit: Quelque chose de bizarre se passe. Voici mes résultats dans l'émulateur SDK version 23 (le dispositif de test Lollipop + est mort en ce moment ...):
Et dans l'émulateur SDK version 21:
la source
width
height
viewport
height
etwidth
de supprimerxml
?AppCompat 23.2 introduit des dessins vectoriels pour tous les appareils exécutant Android 2.1 et supérieur. Les images sont mises à l'échelle correctement, indépendamment de la largeur / hauteur spécifiée dans le fichier XML du dessin vectoriel. Malheureusement, cette implémentation n'est pas utilisée dans l'API de niveau 21 et supérieur (en faveur de l'implémentation native).
La bonne nouvelle est que nous pouvons forcer AppCompat à utiliser son implémentation aux niveaux d'API 21 et 22. La mauvaise nouvelle est que nous devons utiliser la réflexion pour ce faire.
Tout d'abord, assurez-vous que vous utilisez la dernière version d'AppCompat et que vous avez activé la nouvelle implémentation vectorielle:
Ensuite, appelez
useCompatVectorIfNeeded();
onCreate () de votre application:Enfin, assurez-vous que vous utilisez
app:srcCompat
au lieu deandroid:src
pour définir l'image de votre ImageView:Vos dessins vectoriels devraient maintenant être mis à l'échelle correctement!
la source
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 ainsi qu'une grande image de largeur proche de l'écran?
3) Comment utiliser efficacement les attributs width / height et quelle est la différence avec viewportWidth / Height?
la source
Je résous mon problème en changeant simplement la taille de l'image vectorielle. Dès le début, c'était une ressource comme:
Et je l'ai changé en 150dp (taille d'ImageView dans la mise en page avec cette ressource vectorielle) comme:
Ça marche pour moi.
la source
J'essaye la plupart de ces moyens, mais malheureusement, aucun d'entre eux n'a fonctionné. J'essaie
fitXY
dansImageView
, j'essayer d' utiliserapp:srcCompat
mais ne peux même pas l' utiliser. mais j'ai trouvé une astuce:Mais le but de cette façon est de voir les dimensions. si votre
ImageView
a des dimensions incorrectes, drawable obtient Stretch. vous devez le contrôler dans les versions pré-lollipop ou utiliser certaines vuesPercentRelativeLayout
.J'espère que c'est utile.
la source
Premièrement : importez svg vers drawble: (( https://www.learn2crack.com/2016/02/android-studio-svg.html ))
Deuxièmement : si vous voulez une prise en charge d'Android API 7+, vous devez utiliser la bibliothèque de support Android selon (( https://stackoverflow.com/a/44713221/1140304 ))
1- ajouter
dans votre fichier build.gradle.
2-Utilisez l'espace de noms dans votre mise en page qui a imageView:
Troisièmement : définissez imageView avec android: scaleType = "fitXY" et utilisez app: srcCompat
Quatrièmement : si vous voulez définir svg dans le code java, vous devez ajouter la ligne ci-dessous sur oncreate methoed
la source
Pour moi, la raison pour laquelle les vecteurs ont été convertis en png était l'
android:fillType="evenodd"
attribut dans mon dessin vectoriel. Lorsque j'ai supprimé toutes les occurrences de cet attribut dans mon dessin (par conséquent, lenonzero
type de remplissage par défaut appliqué au vecteur), la prochaine fois que l'application a été créée, tout allait bien.la source