2013-03-28 16 views
6

In un'app che sto sviluppando sto cercando di creare in modo programmatico uno ImageButton che sia una copia dello ImageButton selezionato, ma l'immagine è colorata in un modo diverso, diciamo rosso.Cambiare temporaneamente colore selezionabile

Se uso il PowerDuff.Mode.MULTIPLY:

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

Poi anche l'originale ImageButton cambia il suo colore rosso per quanto condividono lo stesso drawable. C'è un modo per applicare il filtro solo sul clonebutton senza utilizzare due diversi drawables? Ad esempio, è possibile in qualche modo mettere un livello di colorazione sopra a clonebutton senza modificare lo drawable?

Aggiornamento ho impostato la drawable come mutabile:

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

questo modo si evita la mia clonebutton di condividere lo stato della sua drawable ad altri views.

risposta

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

Rendere questo drawable mutevole. Questa operazione non può essere annullata. Un drawable mutabile è garantito per non condividere il suo stato con qualsiasi altro drawable . Ciò è particolarmente utile quando è necessario modificare le proprietà dei drawable caricati dalle risorse. Per impostazione predefinita, tutte le istanze estraibili caricate dalla stessa risorsa condividono uno stato comune; se si modifica lo stato di un'istanza con lo , tutte le altre istanze riceveranno la stessa modifica . Chiamare questo metodo su un Drawable mutabile sarà senza alcun effetto.

+0

questo ha funzionato perfettamente! – Vektor88

+0

La risposta è arrivata così velocemente che non ho potuto accettarlo in quel momento a causa della mia bassa reputazione, ma questo funziona sicuramente! – Vektor88

+0

:) ........ non ci sono problemi – Triode

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

provare questo: o prendere il codice qui sotto secondo il vostro bisogno

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

Questo non funzionerà poiché il drawable di riferimento è lo stesso. – Vektor88

+0

hai controllato il secondo codice come aveva funzionato per me –

+0

Nel mio caso voglio colorare il drawable e non lo sfondo. Due pulsanti condividono lo stesso drawable ma non lo stesso sfondo e questo spiega il motivo per cui funziona, ma non è quello che voglio ottenere – Vektor88

1

Su Lollipop non devi fare questo programmatico, cioè colorfilters, se non vuoi. Puoi farlo semplicemente impostando una tinta su un drawable xml.

<?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"/> 

Questo potrebbe non funzionare se si dispone di un numero illimitato di colori, ma se sono limitati questa è davvero una buona opzione. Check out my blog post for more information.

+0

Ottima risposta Stavo già provando questo, ma non ha funzionato dato che ho usato '# 000' invece di' # ff000000'.Che questo attibute sia permesso in Lollipop non è documentato. Dovrebbero aggiungere questo. – rekire

Problemi correlati