我有一个屏幕,其中多个按钮使用相同的背景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的更改的影响。
除了创建第二个背景图像以显示按下状态之外,还有什么解决方案?如果有一个简单的程序化解决方案,我可以添加到我的代码并在每个项目中使用,这将是一件好事。
答案 0 :(得分:67)
适合您的示例:
Drawable buttonBackground = context.getResources().getDrawable(R.drawable.bg);
buttonBackground = buttonBackground.mutate();
//Set your filter here