Je souhaite modifier la couleur de remplissage d'un fichier vectoriel dans Android par programmation.
Dans le fichier xml, je peux définir ma couleur avec l'attribut Android: fillColor mais je veux changer la couleur lors de l'exécution.
Des exemples pour ça? Merci.
This est exactement ce dont vous avez besoin. Crédits à @ emmaguy , l'auteur de l'article. Je viens d'ajouter le support complet de Support Library 23.4 + , qui vous permet d'arrêter de générer des pngs au moment de l'exécution:
// Gradle Plugin 2.0+
Android {
defaultConfig {
vectorDrawables.useSupportLibrary = true
}
}
Et si cette ligne est définie sur onCreate de votre activité ou application:
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
Vous pouvez utiliser vos SVG non seulement avec srcCompat
mais aussi avec d'autres attributs tels que drawableLeft
, background
, etc. dans TextView, ToggleButton et ainsi de suite. Il fonctionne également s'il est utilisé sur des sélecteurs.
Remarque : J'ai modifié le code pour utiliser VectorDrawableCompat.create
au lieu de ResourcesCompat.getDrawable
. Sinon, cela ne fonctionnerait pas et lancerait org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector
.
Tout d'abord, nous créons des attributs pour les deux types de babioles, afin que nous puissions changer leurs couleurs:
<declare-styleable name="ChristmasTree">
<attr name="bauble_round" format="color" />
<attr name="bauble_small" format="color" />
</declare-styleable>
Ensuite, dans le VectorDrawable, définissez les pièces que nous voulons modifier dynamiquement pour utiliser ces attributs:
<path
Android:fillColor="?attr/bauble_round"
Android:pathData="...." />
<path
Android:fillColor="?attr/bauble_small"
Android:pathData="...." />
...
Créez des thèmes et définissez les couleurs que vous souhaitez utiliser:
<style name="UpdatedScene" parent="DefaultScene">
<item name="bauble_round">#db486e</item>
<item name="bauble_small">#22c7f7</item>
</style>
<style name="DefaultScene">
<item name="bauble_round">#fec758</item>
<item name="bauble_small">#f22424</item>
</style>
Utilisez le dessinable dans une ImageView:
final ContextThemeWrapper wrapper = new ContextThemeWrapper(this, R.style.DefaultScene);
final Drawable drawable = VectorDrawableCompat.create(getResources(), R.drawable.christmas, wrapper.getTheme());
imageView.setImageDrawable(drawable);
C'est ça! Lorsque vous souhaitez modifier les couleurs, définissez simplement un thème différent et votre dessin sera mis à jour. Voir le GitHub repo pour un échantillon complet.
Si vous souhaitez modifier la couleur entière, vous pouvez appliquer un PorterduffColorFilter. Mais cela ne fonctionne pas pour un seul <path>
. Uniquement pour l'ensemble dessinable.
public void applyThemeToDrawable(Drawable image) {
if (image != null) {
PorterDuffColorFilter porterDuffColorFilter = new PorterDuffColorFilter(Color.BLUE,
PorterDuff.Mode.SRC_ATOP);
image.setColorFilter(porterDuffColorFilter);
}
}
VectorDrawable étend la classe Drawable. Voir la documentation
ajoutez la méthode setColorFilter()
à votre vecteur de contenu d'image (est ajoutée au niveau 8 de l'API) comme ceci:
imgshare = (Imageview) findviewbyId(R.id.imageshare);
imgshare.setColorFilter(color);