2012-06-04 9 views
23

Ho una schermata in cui più pulsanti utilizzano lo stesso sfondo Drawable. Ho un codice riutilizzabile che uso in vari progetti per aggiungere un listener OnTouch che aggiunge un filtro di colore grigio mentre si tocca un pulsante. Di solito funziona bene, ma in questo caso TUTTI i pulsanti sono colorati quando viene premuto uno di essi.L'aggiunta di un filtro colorato a un Drawable modifica tutti i pulsanti che utilizzano lo stesso Drawable

vedo una spiegazione http://developer.android.com/guide/topics/graphics/2d-graphics.html:

Nota: ogni risorsa unica nel progetto può mantenere una sola Stato, indipendentemente dal numero di oggetti diversi si può istanziare per esso. Ad esempio, se si istanziano due oggetti Drawable dalla stessa risorsa immagine , quindi si modifica una proprietà (come l'alpha) per uno di i Drawable, quindi interesserà anche l'altro.

La soluzione suggerita è utilizzare TweenAnimation, che non sembra funzionare con i filtri di colore.

Ho anche visto Android: Cloning a drawable in order to make a StateListDrawable with filters che suggerisce l'uso di drawable.getConstantState(). NewDrawable(). Questo non sembra fare la differenza. Suppongo che finché verrà utilizzato lo stesso file immagine fisico, tutti i Drawable saranno influenzati da una modifica a qualsiasi altro Drawable utilizzando la stessa risorsa.

Quale soluzione c'è, oltre alla creazione di una seconda immagine di sfondo per mostrare lo stato premuto? Sarebbe bello avere una soluzione programmatica semplice che posso aggiungere al mio codice e utilizzare in ogni progetto.

risposta

54

esempio che dovrebbe funzionare per voi:

Drawable buttonBackground = context.getResources().getDrawable(R.drawable.bg); 
buttonBackground = buttonBackground.mutate(); 

//Set your filter here 
+0

Ho avuto lo stesso problema utilizzando sovrapposizioni con la stessa Drawable e un colorfilter diverso su un MapView. mutare(); aggiustato. Grazie :) –

+8

Nota che funziona solo se chiami getDrawable. Se hai memorizzato nella cache il drawable in una variabile e chiami mutate() su di esso, condivideranno comunque lo stato. – Jeremy

+1

Stavo diventando pazzo con questo, questo ha risolto il problema, grazie mille! :) –

Problemi correlati