J'ai un ImageView
avec Android:src
défini sur un ShapedDrawable
, à savoir un cercle blanc. Ce que je veux, c'est coloriser cette ImageView
au runtime en réponse à certains événements. imgView.setColorFilter
semble être une solution, mais après avoir utilisé ceci (différents paramètres ont été essayés), l'image devient invisible (je ne la vois pas à l'écran).
Comment résoudre ceci? Et y a-t-il de meilleurs moyens d'avoir des cercles de couleur?
Très bien, j’ai eu un jeu rapide avec ça et j’ai remarqué que votre problème des cercles disparaissait. Sans que vous décriviez quoi exactement vous avez essayé, je suppose que vous n'avez pas encore essayé de définir le filtre de couleur sur la variable Drawable
elle-même? (par opposition à la ImageView
, qui ne semble fonctionner qu'avec BitmapDrawable
s).
Les instructions suivantes fonctionnent parfaitement pour une ShapeDrawable
déclarée par xml avec le blanc comme couleur initiale:
ImageView redCircle = (ImageView) findViewById(R.id.circle_red_imageview);
ImageView greenCircle = (ImageView) findViewById(R.id.circle_green_imageview);
ImageView blueCircle = (ImageView) findViewById(R.id.circle_blue_imageview);
// we can create the color values in different ways:
redCircle.getDrawable().setColorFilter(Color.RED, PorterDuff.Mode.MULTIPLY );
greenCircle.getDrawable().setColorFilter(0xff00ff00, PorterDuff.Mode.MULTIPLY );
blueCircle.getDrawable().setColorFilter(getResources().getColor(R.color.blue), PorterDuff.Mode.MULTIPLY );
La ShapeDrawable
pour l'exhaustivité: (je règle la taille sur la ImageView
, voir ci-dessous)
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="oval" >
<solid Android:color="@Android:color/white" />
</shape>
Et l’un des ImageView
s à titre d’exemple:
<ImageView
Android:id="@+id/circle_red_imageview"
Android:layout_width="40dp"
Android:layout_height="40dp"
Android:padding="5dp"
Android:src="@drawable/circle_white" />
Résultat visuel:
Si vous souhaitez modifier l'utilisation de la couleur de l'image
PorterDuff.Mode.SRC_ATOP instead
PorterDuff.Mode.MULTIPLY
dans l'exemple ci-dessus.
Vous pouvez utiliser l'attribut Android:tint
dans ImageView au format xml.
Exemple:
<ImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:src="@drawable/your_drawable"
Android:tint="@color/your_color" />
Testé sur Android 4.1.2 et 6.0.1
Vous pouvez le faire très simplement en utilisant cette bibliothèque: https://github.com/jrvansuita/IconHandler
Cela fonctionnera comme ceci:
Icon.on(yourImageView).color(R.color.your_color).icon(R.mipmap.your_icon).put();