将颜色过滤器添加到Drawable会使用相同的Drawable更改所有按钮

时间:2012-06-04 22:43:15

标签: android

我有一个屏幕,其中多个按钮使用相同的背景Drawable。我有可重用的代码,我在各种项目中使用它来添加一个OnTouch监听器,在触摸按钮时添加灰色滤色器。这通常可以正常工作,但在这种情况下,当按下任何按钮时,所有按钮都会着色。

我在http://developer.android.com/guide/topics/graphics/2d-graphics.html中看到了一个解释:

  

注意:项目中的每个唯一资源只能维护一个   状态,无论您可以实例化多少个不同的对象   它。例如,如果您实例化两个Drawable对象   图像资源,然后更改其中一个属性(如alpha)   Drawables,然后它也会影响另一个。

建议的解决方案是使用TweenAnimation,它似乎不适用于彩色滤镜。

我还看到Android: Cloning a drawable in order to make a StateListDrawable with filters建议使用drawable.getConstantState()。newDrawable()。这似乎没有什么区别。我猜测,只要使用相同的物理图像文件,所有Drawables都会受到使用相同资源对任何其他Drawable的更改的影响。

除了创建第二个背景图像以显示按下状态之外,还有什么解决方案?如果有一个简单的程序化解决方案,我可以添加到我的代码并在每个项目中使用,这将是一件好事。

1 个答案:

答案 0 :(得分:67)

适合您的示例:

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

//Set your filter here