web-dev-qa-db-fra.com

VectorDrawable ne s'affiche pas correctement sur l'API 23

Je remplace toutes mes icônes par VectorDrawables dans la mesure du possible. Mais j'ai remarqué que certains d'entre eux ne s'affichent pas correctement sur l'API 23 et que la couleur semble saigner. L'un de ces 3 rend bien. Voici une capture d'écran d'un projet isolé J'ai créé:

enter image description here

Semble parfaitement bien sur API 21:

enter image description here

Le code source de l'exemple d'application est ici

J'utilise AppCompat 24.0.0, app: srcCompat sur ImageView et j'ai défini vectorDrawables.useSupportLibrary = true. J'ai également essayé AppCompat 23.4.0 avec la cible 23. Cependant, si je supprime appCompat et que je mets minSdkVersion à 21 et que j'utilise le support vectoriel natif, les résultats ne changent pas. Le IDE ne se plaint pas que quoi que ce soit ne soit pas pris en charge. Comment savoir quel est le problème? Est-ce un bug de plate-forme? Y a-t-il des solutions?

28
gitter

J'ai eu exactement le même problème sur l'API 23 uniquement. Je définissais ma source ImageView dynamiquement, plutôt qu'en XML. J'ai réalisé que le problème était que je faisais:

Drawable show = getContext().getResources().getDrawable(resourceId);

Quand j'aurais dû faire:

Drawable show = AppCompatResources.getDrawable(getContext(), resourceId);

J'espère que ça aidera quelqu'un!

28
Luke

Tout d'abord, je ne suis pas un développeur Android, je suis un concepteur aidant avec certains actifs de production dans Android Studio.

Nous avons commencé à rencontrer les mêmes problèmes avec certains de nos dessinables vectoriels de 22 à 24.

(J'ai mis à jour mon projet pour utiliser Nexus 6 API 23 et compiler la version 24, construire la version 24, le SDK cible 24. Ensuite, mes drawables semblaient fermer les chemins et ajouter des remplissages similaires à ce qui se passe ci-dessus.)

Testé

J'ai accès à Adobe Illustrator CC (19.2.1) et j'ai exploré diverses options de chemin sur un objet avec un trait. Tout, de l'expansion des chemins aux remplissages, la combinaison de chemins, la création de chemins composés, la fermeture de chemins, etc.

Options de conversion

Le convertisseur en ligne SVG vers Drawable ( http://inloop.github.io/svg2Android/ ) a une option, " Bake se transforme en chemin (expérimental)," et je l'ai sélectionné et bien qu'il ait amélioré le rendu, ce n'était PAS encore parfait.

Solution potentielle

Ensuite, je suis retourné dans Illustrator et j'ai essayé " Enregistrer sous" SVG contre " Exporter" comme SVG. Je ne sais pas quelles sont les différences d'Adobe Illustrator entre les deux paramètres, mais ils crachent des données XML SVG légèrement différentes.

J'ai ensuite pris le nouveau "Save As SVG" et l'ai déposé dans ce convertisseur Drawable en ligne: http://inloop.github.io/svg2Android/

Et ces options ont été vérifiées:

  • Supprimer les groupes vides sans attributs
  • Bake se transforme en chemin (expérimental)

Le nouveau XML Drawable qu'il a renvoyé semble fonctionner et s'afficher correctement.

Je ne sais pas si cela fonctionnera avec d'autres graphiques vectoriels qui ont des traits, des formes et des remplissages, mais j'ai pensé partager mon expérience. Ce n'est pas une vraie solution, car il semble que ce soit un bogue dans le nouveau SDK Android, et il l'avait déjà pris en charge auparavant, mais cela peut être une solution temporaire possible pour certaines personnes.

19
Patrick Hansen

Lisez ce support pour une explication plus détaillée https://medium.com/androiddevelopers/using-vector-assets-in-Android-apps-4318fd662eb9

TL; DR

Android {
    defaultConfig {
        vectorDrawables.useSupportLibrary = true
    }
}

Utilisation

app:srcCompat
app:buttonCompat
app:drawableStartCompat...

Au lieu de

Android:src
Android:button
Android:drawableStart

Par programme

AppCompatResources.getDrawable(context, R.drawable.my_drawable)
1
Pedro Romão