it-swarm.com.de

setColorFilter funktioniert nicht

Ich versuche, einen einfachen Farbfilter in einer Bildansicht zu implementieren, um das schwarze Bild in ein weißes Bild umzuwandeln. Um dies zu erreichen, mache ich Folgendes:

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

Ich habe auch versucht, die Farbe im Farbfilter in Rot und Weiß zu ändern, aber alle haben keine Auswirkung. Was mache ich falsch?

33
Tim Kranen

So sehr ich es hasse, meine eigenen Fragen zu beantworten, fand ich das Problem: Ich hätte verwenden sollen:

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

Es hängt davon ab, welche Art von Filterung Sie anwenden möchten. Wenn Sie eine neue Farbe mit Transparenz auf ein Bild anwenden möchten, hat das für mich funktioniert: 

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

Wenn Sie mehr über diese PorterDuff-Filter erfahren möchten, habe ich einen Goog-Artikel gefunden, der mir dabei geholfen hat zu verstehen: http://www.ibm.com/developerworks/Java/library/j-mer0918/ )

26
jsidera

Hatte dasselbe Problem auf Android 6. Dieses Problem wurde gelöst, indem ImageView.getDrawable().setColorFilter() anstelle von ImageView.setColorFilter() verwendet wurde.

19

Wir verwenden diesen 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

Ich hatte Probleme mit setColorFilter auf einem Samsung S3 mit 4.3 und der einzige Weg, den Filter zum Laufen zu bringen, war die Anwendung in der draw(Canvas canvas)-Methode:

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);
}

Das einfache Anwenden von setColorFilter auf BitmapDrawable schien keine Auswirkung zu haben.

3
dr_sulli

Für mich funktionierte nur diese Lösung:

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

der Filter wird angewendet, wenn R.drawable.img ein Vektorbild ist und keine Auswirkungen auf die Rasterressource hat

2
adray

Für mich funktionierte es einfach nicht, setColorFilter() für die ImageView aufzurufen.

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

Aus welchem ​​Grund auch immer, auf API 21 konnte setColorFilter() nur dann richtig funktionieren, wenn die Änderung in der Nachrichtenwarteschlange der Ansichten veröffentlicht wurde.

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

Für Android 4.3 und 4.4 funktioniert setColorFilter nicht. Verwenden Sie stattdessen DrawableCompat.

    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