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

Posted

技术标签:

【中文标题】将颜色过滤器添加到 Drawable 会更改使用相同 Drawable 的所有 Button【英文标题】:Adding a color filter to a Drawable changes all Buttons using the same Drawable 【发布时间】:2012-06-09 00:07:04 【问题描述】:

我有一个屏幕,其中多个按钮使用相同的背景 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()。这似乎没有什么不同。我猜只要使用相同的物理图像文件,所有 Drawable 都会受到使用相同资源更改任何其他 Drawable 的影响。

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

【问题讨论】:

【参考方案1】:

应该适合您的示例:

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

//Set your filter here

【讨论】:

我在 MapView 上使用具有相同 Drawable 和不同 ColorFilter 的 Overlays 时遇到了同样的问题。变异();修复。谢谢:) 请注意,这仅在您调用 getDrawable 时有效。如果您已将可绘制对象缓存在变量中并对其调用 mutate() ,那么它们仍将共享状态。 我对此感到抓狂,这解决了问题,非常感谢! :) Android GUI 处理充满了像这样愚蠢的时间窃贼。希望谷歌在未来创造更好的营业额,以便他们能够负担得起专业的程序员。请注意,不推荐使用 getDrawable,此处修改解决方案:***.com/questions/29041027/… 非常感谢!我想使用 StateListDrawable 使用相同的可绘制对象,这解决了它!这来自 Android 文档:使这个 drawable 可变。此操作无法撤消。可变的drawable保证不会与任何其他drawable共享其状态。当您需要修改从资源加载的drawable的属性时,这特别有用。默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果您修改一个实例的状态,所有其他实例将收到相同的修改。

以上是关于将颜色过滤器添加到 Drawable 会更改使用相同 Drawable 的所有 Button的主要内容,如果未能解决你的问题,请参考以下文章

使用android中的颜色选择器更改textview的文本颜色和背景颜色

向 Xamarin Android 添加新图像会更改所有其他图像

Android - 将图像添加到项目

如何更改 Infragistics 的 UltraGrid 过滤器行的背景颜色?

Android Drawable 颜色运行时

如何动态更改 TextView 背景颜色?