Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding a color filter to a Drawable changes all Buttons using the same Drawable

Tags:

android

I have a screen where multiple Buttons use the same background Drawable. I have reusable code I use in various projects to add an OnTouch listener that adds a gray color filter while a button is being touched. That usually works fine, but in this case ALL the buttons are tinted when any of them is pressed.

I see an explanation in http://developer.android.com/guide/topics/graphics/2d-graphics.html:

Note: Each unique resource in your project can maintain only one state, no matter how many different objects you may instantiate for it. For example, if you instantiate two Drawable objects from the same image resource, then change a property (such as the alpha) for one of the Drawables, then it will also affect the other.

The suggested solution is to use a TweenAnimation, which does not seem to work with color filters.

I also saw Android: Cloning a drawable in order to make a StateListDrawable with filters which suggests using drawable.getConstantState().newDrawable(). This does not seem to make a difference. I'm guessing that as long as the same physical image file is used, all Drawables will be affected by a change to any other Drawable using the same resource.

What solution is there, other than creating a second background image to show the pressed state? It would be nice to have a simple programmatic solution I can add to my code and use in every project.

like image 370
Chad Schultz Avatar asked Jun 04 '12 22:06

Chad Schultz


1 Answers

Example that should work for you:

Drawable buttonBackground = context.getResources().getDrawable(R.drawable.bg); buttonBackground = buttonBackground.mutate();  //Set your filter here 
like image 64
Eric Tremblay Avatar answered Sep 20 '22 12:09

Eric Tremblay