web-dev-qa-db-fra.com

setColorFilter ne fonctionne pas

J'essaie d'implémenter un filtre de couleur simple sur une image pour transformer l'image noire en image blanche. Pour y parvenir, je fais ce qui suit:

    weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
    weatherImg.setImageResource(R.drawable.b_clouded_rain);

J'ai également essayé de changer la couleur du filtre de couleur en rouge et blanc, mais toutes n'ont aucun effet. Qu'est-ce que je fais mal?

33
Tim Kranen

Même si je déteste répondre à mes propres questions, j’ai trouvé le problème:

   weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
76
Tim Kranen

Cela dépend du type de filtrage que vous souhaitez appliquer. Si vous souhaitez appliquer une nouvelle couleur à une image comportant des transparents, voici ce qui a fonctionné pour moi: 

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);

Si vous voulez en savoir plus sur ces filtres PorterDuff, j'ai trouvé un article de goog qui m'a aidé à comprendre: http://www.ibm.com/developerworks/Java/library/j-mer0918/ lisez-le: )

26
jsidera

Avait le même problème sur Android 6. Résolu en utilisant ImageView.getDrawable().setColorFilter() au lieu de ImageView.setColorFilter().

19

Nous utilisons ce code

Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource));
        drawable.mutate();
        DrawableCompat.setTint(drawable, getColor(color));
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

public static int getColor(int id) {
        return ContextCompat.getColor(getInstance().context, id);
    }

public static Drawable getDrawable(int id) {
        return ContextCompat.getDrawable(getInstance().context, id);
    }
4
Rafael

Je rencontrais des problèmes avec setColorFilter sur un Samsung S3 sous 4.3 et la seule façon pour que le filtre fonctionne est de l'appliquer dans la méthode draw(Canvas canvas):

public class ColouredDrawable extends BitmapDrawable {

private ColorFilter mColorFilter;

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) {
    super(resources, toTransform);
    float[] matrix = {
            0, 0, 0, 0, ((toColour & 0xFF0000) / 0xFFFF),
            0, 0, 0, 0, ((toColour & 0xFF00) / 0xFF),
            0, 0, 0, 0, (toColour & 0xFF),
            0, 0, 0, 1, 0 };
    mColorFilter = new ColorMatrixColorFilter(matrix);
}

@Override
public void draw(Canvas canvas) {
    setColorFilter(mColorFilter);
    super.draw(canvas);
}

L'application simple setColorFilter à BitmapDrawable ne semble pas avoir d'effet.

3
dr_sulli

Pour moi seule cette solution a fonctionné:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);

le filtre s'applique si R.drawable.img est une image vectorielle et n'a aucun effet sur les ressources raster

2
adray

Pour moi, appeler simplement setColorFilter() sur la ImageView ne fonctionnait pas.

imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) //didnt work on 21, only 22+

Pour une raison quelconque, dans l'API 21, la seule façon pour que setColorFilter() fonctionne correctement était de publier la modification dans la file d'attente des messages de vues.

imageView.post { imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) } //this works on 21+
1
styler1972

Pour Android 4.3 et 4.4, setColorFilter ne fonctionne pas. Utilisez DrawableCompat à la place.

    val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
            context,
            R.drawable.b_clouded_rain));
    DrawableCompat.setTint(drawable, foregroundColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN)
            .setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);

    weatherImg.setImageResource(R.drawable.b_clouded_rain);
0
methodsignature