web-dev-qa-db-fra.com

Application de ColorFilter à ImageView avec ShapedDrawable

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?

36
aplavin

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 BitmapDrawables).

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 ImageViews à 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:

Screenshot of colored circles

99
MH.

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.

12
Vishwas Vaishnav

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

6
Volodymyr Yatsykiv

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();
0
Vansuita Jr.