2012-06-04 13 views
23

Tengo una pantalla donde varios botones usan el mismo fondo Drawable. Tengo un código reutilizable que uso en varios proyectos para agregar un oyente OnTouch que agrega un filtro de color gris mientras se toca un botón. Por lo general, funciona bien, pero en este caso TODOS los botones están teñidos cuando se presiona alguno de ellos.Agregar un filtro de color a un Drawable cambia todos los botones usando el mismo Drawable

veo una explicación en http://developer.android.com/guide/topics/graphics/2d-graphics.html:

Nota: Cada recurso único en su proyecto puede mantener sólo una estado, no importa la cantidad de objetos diferentes que puede crear una instancia de ella. Por ejemplo, si instancia dos objetos Drawable del mismo recurso de imagen , entonces cambie una propiedad (como el alfa) por uno de los los Drawables, y luego también afectará al otro.

La solución sugerida es utilizar una TweenAnimation, que no parece funcionar con filtros de color.

También vi Android: Cloning a drawable in order to make a StateListDrawable with filters que sugiere usar drawable.getConstantState(). NewDrawable(). Esto no parece hacer la diferencia. Supongo que, siempre que se use el mismo archivo de imagen física, todos los Drawables se verán afectados por un cambio en cualquier otro Drawable que utilice el mismo recurso.

¿Qué solución hay, aparte de crear una segunda imagen de fondo para mostrar el estado presionado? Sería bueno tener una solución programática simple que pueda agregar a mi código y usar en cada proyecto.

Respuesta

54

ejemplo que debería funcionar para usted:

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

//Set your filter here 
+0

que tenían el mismo problema utilizando superposiciones con el mismo Disponibles y una ColorFilter diferente en un MapView. mudar(); arreglado. Gracias :) –

+8

Tenga en cuenta que esto solo funciona si llama a getDrawable. Si ha guardado en caché el dibujo en una variable y llama a mutate() sobre él, aún así compartirán el estado. – Jeremy

+1

Me estaba volviendo loco con esto, esto resolvió el problema, ¡muchas gracias! :) –

Cuestiones relacionadas