Добавление цветового фильтра в Drawable изменяет все кнопки с использованием того же Drawable

У меня есть экран, на котором несколько кнопок используют один и тот же фон Drawable. У меня есть многократно используемый код, который я использую в разных проектах, чтобы добавить слушателя OnTouch, который добавляет серый цветной фильтр при нажатии кнопки. Обычно это работает нормально, но в этом случае ВСЕ кнопки тонируются, когда нажимается какая-либо из них.

Я вижу объяснение в http://developer.android.com/guide/topics/graphics/2d-graphics.html:

Примечание. Каждый уникальный ресурс в вашем проекте может поддерживать только один независимо от того, сколько различных объектов вы можете создать для Это. Например, если вы создаете два объекта Drawable из одного и того же затем измените свойство (например, альфа) для одного из Drawables, то это также повлияет на другое.

Предлагаемое решение - использовать TweenAnimation, который, похоже, не работает с цветными фильтрами.

Я также видел Android: клонирование рисунка, чтобы сделать StateListDrawable с фильтрами, в котором предлагается использовать drawable.getConstantState(). newDrawable(). Кажется, это не имеет значения. Я предполагаю, что до тех пор, пока используется один и тот же файл физического изображения, на все Drawables будет влиять изменение на любой другой Drawable с использованием того же ресурса.

Какое решение существует, кроме создания второго фонового изображения для отображения нажатого состояния? Было бы неплохо иметь простое программное решение, которое я могу добавить к своему коду и использовать в каждом проекте.

Ответ 1

Пример, который должен работать для вас:

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

//Set your filter here