594 Stimmen

Wie kann man die Tönung für ein Bildansicht programmatisch in Android festlegen?

Müssen für ein ImageView einen Farbton einstellen... Ich benutze es auf folgende Weise:

imageView.setColorFilter(R.color.blue, android.graphics.PorterDuff.Mode.MULTIPLY);

Aber es ändert sich nicht...

1271voto

Hardik Punkte 18120

UPDATE:
@ADev hat in seiner Antwort hier eine neuere Lösung, aber seine Lösung erfordert eine neuere Support-Bibliothek - 25.4.0 oder höher.


Sie können die Farbschattierung ganz einfach im Code ändern über:

imageView.setColorFilter(Color.argb(255, 255, 255, 255)); // Weiße Schattierung

Wenn Sie Farbschattierung wünschen, dann

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.MULTIPLY);

Für Vektorgrafiken

imageView.setColorFilter(ContextCompat.getColor(context, R.color.COLOR_YOUR_COLOR), android.graphics.PorterDuff.Mode.SRC_IN);

408voto

ADev Punkte 5289

Die meisten Antworten beziehen sich auf die Verwendung von setColorFilter, was nicht das ist, was ursprünglich gefragt wurde.

Der Benutzer @Tad hat seine Antwort in die richtige Richtung, aber es funktioniert nur auf API 21+.

Um den Farbton auf allen Android-Versionen einzustellen, verwenden Sie den ImageViewCompat:

ImageViewCompat.setImageTintList(imageView, ColorStateList.valueOf(yourTint));

Beachten Sie, dass yourTint in diesem Fall ein "Farbint" sein muss. Wenn Sie einen Farbressource wie R.color.blue haben, müssen Sie zuerst das Farbint laden:

ContextCompat.getColor(context, R.color.blue);

79voto

Etienne Lawlor Punkte 6851

Dies hat für mich funktioniert

mImageView.setColorFilter(ContextCompat.getColor(getContext(), R.color.green_500));

40voto

CrepeGoat Punkte 2017

@Hardik hat Recht. Der andere Fehler in deinem Code liegt darin, wenn du auf deine XML-definierte Farbe verweist. Du hast nur die ID an die Methode setColorFilter übergeben, wenn du die ID verwenden solltest, um die Farbressource zu finden, und die Ressource an die Methode setColorFilter weiterzugeben. Dein ursprünglicher Code wird unten neu geschrieben.

Wenn diese Zeile innerhalb deiner Aktivität ist:

imageView.setColorFilter(getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Ansonsten musst du auf deine Hauptaktivität verweisen:

Aktivität main = ...
imageView.setColorFilter(main.getResources().getColor(R.color.blue), android.graphics.PorterDuff.Mode.MULTIPLY);

Beachte, dass dies auch für andere Arten von Ressourcen wie Integer, Booleans, Dimensionen usw. gilt. Mit Ausnahme von Strings, für die du in deiner Aktivität direkt getString() verwenden kannst, ohne zuerst getResources() aufrufen zu müssen (frag mich nicht warum).

Ansonsten sieht dein Code gut aus. (Obwohl ich die Methode setColorFilter nicht zu sehr untersucht habe...)

33voto

Manohar Punkte 19019

Bessere vereinfachte Erweiterungsfunktion dank ADev

fun ImageView.setTint(@ColorRes colorRes: Int) {
    ImageViewCompat.setImageTintList(this, ColorStateList.valueOf(ContextCompat.getColor(context, colorRes)))
}

Verwendung:-

imageView.setTint(R.color.tintColor)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X