web-dev-qa-db-fra.com

Changer la couleur de remplissage d'un vecteur dans Android par programmation

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.

29
Sascha K.

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.


Contenu de publication moyen:

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.

30
saiyancoder

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

16
AlbAtNf

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);
6
user6757534