2013-03-28 17 views
6

In einer App, die ich entwickle Ich versuche, eine ImageButton, die eine Kopie der ausgewählten ImageButton ist, programmatisch zu erstellen, aber das Bild ist auf andere Weise eingefärbt, sagen wir rot.Vorübergehend ändern zeichnbare Farbe

Wenn ich die PowerDuff.Mode.MULTIPLY:

clonebutton.getDrawable().setColorFilter(0xFFFF0000,Mode.MULTIPLY); 

Dann noch die ursprüngliche ImageButton ändert seine Farbe in rot, da sie die gleiche drawable teilen. Gibt es eine Möglichkeit, den Filter nur auf den Klon-Button anzuwenden, ohne zwei verschiedene drawables zu verwenden? Zum Beispiel ist es in irgendeiner Weise möglich, eine kolorierte Ebene über klonbutton zu setzen, ohne die drawable zu bearbeiten?

aktualisieren stelle ich die ziehbar als wandelbar:

Drawable d = swipebutton.getDrawable(); 
d.mutate(); 
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 
swipebutton.setImageDrawable(d); 

Das ist mein clonebutton verhindert, dass der Zustand seiner drawable zu anderen views zu teilen.

Antwort

13
Drawable buttonBackground = clonebutton.getDrawable(); 
buttonBackground = buttonBackground.mutate(); 
buttonBackground.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 

Machen Sie dieses ziehbar wandelbar. Dieser Vorgang kann nicht rückgängig gemacht werden. Ein veränderbarer Zeichensatz garantiert seinen Zustand nicht mit anderen Zeichen teilen. Dies ist besonders nützlich, wenn Sie die Eigenschaften der aus Ressourcen geladenen Zeichen ändern müssen. Standardmäßig teilen alle Zeichenausdrücke Instanzen, die von derselben Ressource geladen werden, einen gemeinsamen Status; Wenn Sie den Status einer Instanz ändern, erhalten alle anderen Instanzen die gleiche Änderung. Wenn Sie diese Methode auf eine veränderbare Drawable anwenden, wird keine Wirkung haben.

+0

ziehbare dies funktionierte einwandfrei! – Vektor88

+0

Die Antwort kam so schnell, dass ich es in diesem Moment wegen meines schlechten Rufs nicht akzeptieren konnte, aber das funktioniert definitiv! – Vektor88

+0

:) ......... keine Sorgen – Triode

0
Drawable d=clonebutton.getDrawable() 
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY); 
clonebutton.setDrawable(d); 

dies versuchen: oder den Code unten nehmen nach Ihren Bedarf

switch(v.getId()) 
{ 
case R.id.bt1: 
    Drawable d=b11.getBackground(); 
    d.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 

    b11.setBackgroundDrawable(d); 
    b12.setBackgroundResource(android.R.drawable.btn_default); 
break; 

case R.id.bt2: 
//b2.getBackground().setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 
Drawable dd=b12.getBackground(); 
dd.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY); 

b12.setBackgroundDrawable(dd); 
b11.setBackgroundResource(android.R.drawable.btn_default); 
break; 
} 

switching color of buttons after onclick

+0

Dies funktioniert nicht, da das referenzierte Zeichen identisch ist. – Vektor88

+0

haben Sie den zweiten Code überprüft, wie es für mich gearbeitet hatte –

+0

In meinem Fall möchte ich das Zeichen und nicht den Hintergrund kolorieren. Zwei Tasten teilen den gleichen, aber nicht denselben Hintergrund und das erklärt, warum es funktioniert, aber es ist nicht das, was ich erreichen möchte – Vektor88

1

Auf Lollipop müssen Sie nicht diese programmatische, d. H. Farbfilter, wenn Sie nicht wollen. Sie können es tun, indem Sie einfach einen Farbton auf ein Xml-Zeichen setzen.

<?xml version="1.0" encoding="utf-8"?> 
<bitmap 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:src="@drawable/ic_back" 
    android:tint="@color/red_tint"/> 

Dies funktioniert möglicherweise nicht, wenn Sie eine unbegrenzte Anzahl von Farben haben, aber wenn sie begrenzt sind, ist dies eine wirklich gute Option. Check out my blog post for more information.

+0

Große Antwort Ich habe das schon versucht, aber es hat nicht funktioniert, seit ich '# 000' anstelle von' #ff000000' verwendet habe.Dass diese Eigenschaft in Lollipop erlaubt ist, ist ebenfalls nicht dokumentiert. Sie sollten das hinzufügen. – rekire