Changer fillColor à partir du vecteur dans Android, par programme

Je ne veux pas modifier le fichier fillColor à partir d'un fichier vectoriel dans Android par programme.

Dans le fichier xml, je peux écrire ma couleur avec attribut android: fillColor mais je ne veux pas modifier la couleur dans mon runtime.

  • Android Design réactif
  • Jarsigner: impossible de signer jar: java.util.zip.ZipException: entrée incorrecte taille compressée (attendu 463 mais a obtenu 465 octets)
  • Exception de jeton incorrect - Impossible d'ajouter une fenêtre (Marshmallow - Barre d'outils flottante)
  • Développez TextView avec wrap_content jusqu'à ce que la vue voisine atteigne la fin du parent
  • Android: comment détecter un double-tap?
  • Enregistrer le Bundle dans SharedPreferences
  • Des exemples pour ça? Merci.

  • Comment puis-je faire mon ArrayAdapter suivre le modèle ViewHolder?
  • Cursor Android avec ORMLite à utiliser dans CursorAdapter
  • Comment puis-je passer un contexte à un AsyncTask?
  • Android MediaCodec: réduisez la taille de la vidéo mp4
  • Rejeter l'appel entrant dans Android
  • Erreur inattendue lors de l'analyse de la saisie du fichier hiérarchique UIAUTOMATOR invalide
  • 3 Solutions collect form web for “Changer fillColor à partir du vecteur dans Android, par programme”

    C'est exactement ce dont vous avez besoin. Crédits à @emmaguy , l'auteur de la publication. Je viens d'ajouter le support complet de Support Library 23.4+ , qui vous permet d'arrêter de générer des pngs à l'exécution:

    // Gradle Plugin 2.0+ android { defaultConfig { vectorDrawables.useSupportLibrary = true } } 

    Et si cette ligne est définie sur votre Activité ou l'application onCreate:

     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, etc. Il fonctionne également si utilisé sur les sélecteurs.

    Remarque : J'ai modifié le code pour utiliser VectorDrawableCompat.create au lieu de ResourcesCompat.getDrawable . Sinon, cela ne fonctionnerait pas et lancer org.xmlpull.v1.XmlPullParserException: Binary XML file line #2: invalid drawable tag vector .


    Contenu de publication moyenne:

    Tout d'abord, nous créons des attributs pour les deux types de boules, 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 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 un 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 tout! Lorsque vous souhaitez modifier les couleurs, il vous suffit de définir un thème différent et vos données seront mises à jour. Voir le compte GitHub pour un échantillon complet.

    Si vous souhaitez modifier toute la couleur, vous pouvez appliquer un PorterduffColorFilter. Mais cela ne fonctionne pas pour un seul <path> . Seulement pour l'ensemble dessiné.

     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 Docs

    Ajoutez la méthode setColorFilter à votre vecteur de contenu d'image (est ajouté au niveau 8 d'api) comme ceci:
    Imgshare = (Imageview) findviewbyId (R.id.imageshare);
    Imgshare.setColorFilter (couleur);

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.