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.
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
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.
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é
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.
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.
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)
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 VectorDrawableCompatState
VectorDrawableCompat
.
Puisque c'est un colis privé (par défaut) - vous ne pouvez pas l'utiliser (sauf si vous utilisez réflexion).