Comment changer la couleur du chemin de dessin vectoriel sur le bouton cliquez

avec la nouvelle mise à jour du support android, les vectoriel drawables sont rétrocompatibles. J'ai une image vectorielle avec différents chemins. Je veux que la couleur des chemins change en cliquant sur un bouton ou en fonction d'une valeur d'entrée. Est-il possible d'accéder au paramètre name du chemin vectoriel? Et puis changer la couleur.

25
demandé sur suku 2016-02-25 13:48:04

7 réponses

Utilisez ceci pour changer la couleur d'un chemin dans votre drawable vector

VectorChildFinder vector = new VectorChildFinder(this, R.drawable.my_vector, imageView);

VectorDrawableCompat.VFullPath path1 = vector.findPathByName("path1");
path1.setFillColor(Color.RED); 

La Bibliothèque est ici:https://github.com/devsideal/VectorChildFinder

9
répondu Deven 2018-02-03 07:48:38

la couleur de l'ensemble du vecteur peut être changée à l'aide de setTint.

Vous devez configurer votre ImageView dans votre fichier de mise en page comme ceci:

<ImageView
    android:id="@+id/myImageView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:tint="@color/my_nice_color"
    android:src="@drawable/ic_my_drawable"
    android:scaleType="fitCenter" />

puis changer la couleur de votre image:

DrawableCompat.setTint(myImageView.getDrawable(), ContextCompat.getColor(context, R.color.another_nice_color));

Remarque: myImageView.getDrawable() donne nullpointerexception si le vecteur drawable est définie à l'imageView comme arrière-plan.

39
répondu Marco HC 2017-05-18 09:53:36

Vous pouvez utiliser cette méthode pour changer la couleur dans L'API inférieure pour changer la couleur du vecteur dans fragment

int myVectorColor = ContextCompat.getColor(getActivity(), R.color.colorBlack);
                    myButton.getIcon().setColorFilter(myVectorColor, PorterDuff.Mode.SRC_IN);

à la place de getActivity vous devez utiliser MainActivity.ceci pour changer la couleur du vecteur dans l'activité

4
répondu Arshdeep Singh 2017-07-03 17:57:40

Vérifier ma réponse à cette autre question: https://stackoverflow.com/a/38418049/1335438.

c'est une excellente idée sur la façon de gérer cela en utilisant des thèmes et en paramétrant les chemins afin d'être en mesure de les régler dynamiquement.

1
répondu saiyancoder 2017-05-23 12:10:26

Vous changer la couleur du chemin individuel à l'exécution, sans utiliser la réflexion.

VectorMaster introduit le contrôle dynamique des tirables vectoriels. Chaque aspect d'un traceur vectoriel peut être contrôlé dynamiquement (via des instances Java), en utilisant cette bibliothèque.

il suffit d'ajouter la dépendance suivant dans votre application construire.gradle

dependencies {
    compile 'com.sdsmdg.harjot:vectormaster:1.0.9'
}

Dans votre cas, vous avez besoin d'un simple changement de couleur:

exemple de vecteur: your_vector.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
<path
    android:name="outline"
    android:pathData="M20.84,4..."
    android:strokeColor="#5D5D5D"
    android:fillColor="#00000000"
    android:strokeWidth="2"/>

XML:

<com.sdsmdg.harjot.vectormaster.VectorMasterView
    android:id="@+id/your_vector"
    android:layout_width="150dp"
    android:layout_height="150dp"
    app:vector_src="@drawable/your_drawable" />

Java:

VectorMasterView heartVector = (VectorMasterView) 
findViewById(R.id.your_drawable);

// find the correct path using name
PathModel outline = heartVector.getPathModelByName("outline");

// set the stroke color
outline.setStrokeColor(Color.parseColor("#ED4337"));

// set the fill color (if fill color is not set or is TRANSPARENT, then no fill is drawn)
outline.setFillColor(Color.parseColor("#ED4337"));

From:https://github.com/harjot-oberai/VectorMaster, titulaire d'une licence du MIT.

vous avez maintenant le contrôle total sur les tirables vectoriels.

1
répondu JeRoll 2017-11-07 16:41:26

Il y a plusieurs façons de faire la même chose, mais cela fonctionne pour les deux Vectorial Drawables ainsi que SVG (Local/Réseau).

imageView.setColorFilter(ContextCompat.getColor(context, 
R.color.headPink), android.graphics.PorterDuff.Mode.SRC_IN);

(change R. color.headPink avec la couleur de votre choix)

1
répondu Moonis Abidi 2018-02-07 12:15:26

comme indiqué par @Eyal dans ce post https://stackoverflow.com/a/32007436/4969047

Vous ne peut pas changer la couleur du chemin individuel à l'exécution. En regardant le code source de VectorDrawableCompat, la seule méthode pour exposer l'élément intérieur par son nom est getTargetByName qui est présent à l'intérieur privé classe d'état VectorDrawableCompatStateVectorDrawableCompat.

Puisque c'est un colis privé (par défaut) - vous ne pouvez pas l'utiliser (sauf si vous utilisez réflexion).

0
répondu Shubhral 2017-05-23 12:34:43