Android Studio prend désormais en charge les ressources vectorielles sur 21+ et générera des png pour les versions inférieures au moment de la compilation. J'ai un élément vectoriel (à partir des icônes de matériau) dont je souhaite modifier la couleur de remplissage. Cela fonctionne sur 21+, mais les png générés ne changent pas de couleur. Y a-t-il un moyen de faire cela?
<vector android:height="48dp" android:viewportHeight="24.0"
android:viewportWidth="24.0" android:width="48dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@color/primary" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
android:tint
doit être aprèsandroid:src
drawableLeft
dansButton
?Tu peux le faire.
MAIS vous ne pouvez pas utiliser de références @color pour les couleurs (..lame), sinon cela ne fonctionnera que pour L +
la source
Comme dit dans d'autres réponses, n'éditez pas le vecteur dessiné directement, vous pouvez à la place teinter dans le code java, comme ça:
Et par souci de simplicité, j'ai créé une classe d'assistance:
Pour utiliser, procédez comme suit:
Ou:
la source
Pour changer la couleur de l'image vectorielle, vous pouvez utiliser directement android: tint = "@ color / colorAccent"
Pour changer de couleur par programme
la source
getColor(ResId, Theme)
ne l'est pas. Ou vous pouvez utiliserResourcesCompat.getColor(getResources(), R.color.primary, null);
si vous ne vous souciez pas du thème… ou si votre délégué de contexte / politique EST une activité, vous pouvez le fairegetTheme()
pour ce dernier paramètre.Actuellement, la solution de travail est android: fillColor = "# FFFFFF"
Rien n'a fonctionné pour moi sauf le codage en dur dans le vecteur
Cependant, la couleur de remplissage et la teinte pourraient bientôt fonctionner. Veuillez consulter cette discussion pour plus d'informations:
https://code.google.com/p/android/issues/detail?id=186431
Les couleurs peuvent également rester dans le cache, donc la suppression de l'application pour tous les utilisateurs peut aider.
la source
Le studio Android prend désormais en charge les vecteurs pré-sucette. Pas de conversion PNG. Vous pouvez toujours changer votre couleur de remplissage et cela fonctionnera.
Dans votre ImageView, utilisez
Dans votre fichier gradle,
la source
Mise à jour:
AppCompat
supportD'autres réponses soupçonnant si
android:tint
cela fonctionnera uniquement sur 21+ appareils uniquement, AppCompat ( v23.2.0 et supérieur ) fournit désormais une gestion rétrocompatible de l'attribut de teinte.Ainsi, la marche à suivre serait d'utiliser
AppCompatImageView
etapp:srcCompat
(dans l'espace de noms AppCompat) au lieu deandroid:src
(espace de noms Android).Voici un exemple (AndroidX: il s'agit de androidx.appcompat.widget.AppCompatImageView ;)):
Et n'oubliez pas d'activer la prise en charge des dessins vectoriels dans gradle:
la source
AppCompatImageView
c'est sousandroidx.appcompat.widget.AppCompatImageView
Ajoutez cette bibliothèque au Gradle pour activer le dessin vectoriel de couleur dans les anciens appareils Android.
et resynchroniser gradle. Je pense que cela résoudra le problème.
la source
Si les vecteurs n'affichent pas les couleurs définies individuellement à l'aide de fillColor, ils peuvent être définis sur un paramètre de widget par défaut.
Essayez d'ajouter
app:itemIconTint="@color/lime"
à activity_main.xml pour définir un type de couleur par défaut pour les icônes de widget.VectorDrawable @ développeurs.android
la source
si vous cherchez à prendre en charge l'ancienne version pré lolipop
utiliser le même code xml avec quelques modifications
au lieu de normal
ImageView --> AppCompatImageView
au lieu de
android:src --> app:srcCompat
voici un exemple
n'oubliez pas de mettre à jour votre note comme @ Sayooj Valsan mentionne
Remarque Pour quiconque utilise un vecteur, ne donnez jamais jamais à votre vecteur de référence à une couleur comme celle-ci
android:fillColor="@color/primary"
donne sa valeur hexadécimale.la source
@color
pourfillcolor
?Pour ceux qui n'utilisent pas de
ImageView
, ce qui suit a fonctionné pour moi sur un simpleView
(et par conséquent, le comportement devrait se reproduire sur n'importe quel type de vue)la source