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 - suppression de l'élément de ListView sur un long clic
  • Crittercisme ne fonctionne pas sur le service Android avec processus distinct
  • Utiliser un nouveau sbb de firebase dans le projet d'eclipse Android
  • Comment supprimer des lignes dans SQLite avec plusieurs args?
  • Okhttp intercepteur loggin dans multipart
  • RecyclerVoir surBindViewHolder appelé une seule fois dans la configuration de l'onglet
  • Des exemples pour ça? Merci.

  • Comment créer un service natif android et utiliser un classeur pour communiquer avec lui?
  • Y a-t-il un #ifdef dans Qt pour déterminer si nous construisons pour Android
  • Comment prendre en charge les contrôles dpad pour RecyclerView
  • Le jeu Libgdx se bloque sur Android
  • Android Studio - Comment personnaliser le format de sortie Logcat?
  • Différence entre GL10 et GLES10 sur Android
  • 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.