30

Ich habe eine ImageView mit android:src auf eine ShapedDrawable, nämlich einen weißen Kreis gesetzt. Was ich will, ist dieses ImageView in der Laufzeit zu färben, die auf einige Ereignisse reagiert. imgView.setColorFilter scheint die Lösung zu sein, aber nach der Verwendung dieses (ausprobiert verschiedene Parameter) wird das Bild unsichtbar (ich sehe es nicht auf dem Bildschirm).Anwenden von ColorFilter auf ImageView mit ShapedDrawable

Wie löst man das? Und gibt es bessere Möglichkeiten, Farbkreise zu haben?

+0

Sie könnten [diese verwandten Q & A] (http://stackoverflow.com/questions/4354939/understanding-the-use-of-colormatrix-and-colormatrixcolorfilter-to-modify-a-draw) interessant finden. –

+0

Sorry, aber ich konnte dort nichts finden, was mit dieser Frage zusammenhängt. – aplavin

+0

Ich bin mir nicht sicher, wie Sie die akzeptierte Antwort nicht finden können ... Wie auch immer, hier ist ein weiteres ähnliches Thema: [link] (http://stackoverflow.com/q/1309629/1029225). Wie dort vorgeschlagen, versuchen Sie: 'imgView.setColorFilter (0xff00ffff, PorterDuff.Mode.MULTIPLY);'. Wenn das Ihren Bedürfnissen nicht entspricht, wird auch hier eine anspruchsvollere Lösung vorgeschlagen. –

Antwort

93

In Ordnung, ich hatte ein schnelles Spiel damit und bemerkte, dass dein Problem mit den Kreisen verschwand. Ohne Sie beschreiben was genau Sie ausprobiert, ich nehme an, Sie haben nicht versucht, den Farbfilter auf die Drawable selbst noch zu setzen? (im Gegensatz zu der ImageView, die nur mit BitmapDrawable s scheint).

die folgenden Anweisungen arbeiten für eine xml-deklarierten ShapeDrawable mit weißer als Anfangsfarbe völlig in Ordnung:

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

Die ShapeDrawable der Vollständigkeit halber: (habe ich die Größe auf dem ImageView, siehe unten)

<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > 
    <solid android:color="@android:color/white" /> 
</shape> 

Und einer der ImageView s als Beispiel:

<ImageView 
    android:id="@+id/circle_red_imageview" 
    android:layout_width="40dp" 
    android:layout_height="40dp" 
    android:padding="5dp" 
    android:src="@drawable/circle_white" /> 

Visuelles Ergebnis:

Screenshot of colored circles

+4

Aufruf von 'mutable()' auf der 'Drawable' wird helfen, den Zustand der Zeichen zu behalten. – Sufian

+0

Wow, das hat mich gerade gerettet, du willst den Filter definitiv auf 'Drawable' und nicht einfach auf' ImageView' anwenden. – Maurizio

+0

erhalten wir die genaue Farbe, die wir hier wählen setColorFilter (0xff00ff00, PorterDuff.Mode.MULTIPLY), wenn wir Weiß als Originalfarbe verwenden. Wenn nicht, wie können wir die genaue Farbe erhalten? – SadeepDarshana

11

Wenn Sie Bildfarbe ändern mögen

PorterDuff.Mode.SRC_ATOP instead 
PorterDuff.Mode.MULTIPLY 

in obigem Beispiel.

+0

Ich glaube, Autor fragte nach einem Filter, nicht nur SRC_ATOP oder MULTIPLY. – kelin

5

Sie können das Attribut android:tint in ImageView in XML verwenden.

Beispiel:

<ImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:src="@drawable/your_drawable" 
    android:tint="@color/your_color" /> 

auf Android Getestet 4.1.2 und 6.0.1

+0

nette antwort brauchen nicht laufen – marlonpya

+0

@marlonpya danke! –

0

Sie es sehr sehr einfach tun können, die diese Bibliothek nutzen: https://github.com/jrvansuita/IconHandler

Es wird funktioniert so:

Icon.on(yourImageView).color(R.color.your_color).icon(R.mipmap.your_icon).put();