6

在我正在开发的一个应用程序中,我试图以编程方式创建一个ImageButtonselected 的副本ImageButton,但图像以不同的方式着色,比如说红色。

如果我使用PowerDuff.Mode.MULTIPLY

clonebutton.getDrawable().setColorFilter(0xFFFF0000,Mode.MULTIPLY);

然后即使是原件也ImageButton将其颜色变为红色,因为它们共享相同的drawable. 有没有办法只在 clonebutton 上应用过滤器而不使用两个不同的drawables?例如,是否可以在不编辑的情况下以某种方式在 clonebutton 顶部放置一个着色层drawable

更新 我将drawable设置为可变:

Drawable d = swipebutton.getDrawable();
d.mutate();
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY);
swipebutton.setImageDrawable(d);

这可以防止我的 clonebutton 将其状态共享drawable给其他views.

4

3 回答 3

16
Drawable buttonBackground = clonebutton.getDrawable();
buttonBackground = buttonBackground.mutate();
buttonBackground.setColorFilter(0xFFFF0000,Mode.MULTIPLY);

使这个drawable可变。此操作无法撤消。保证可变的可绘制对象不会与任何其他可绘制对象共享其状态。当您需要修改从资源加载的可绘制对象的属性时,这尤其有用。默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果您修改一个实例的状态,所有其他实例将收到相同的修改。在可变的 Drawable 上调用此方法将无效。

于 2013-03-28T12:45:56.630 回答
1

在 Lollipop 上,如果您不想这样做,则根本不必执行此程序化操作,即颜色过滤器。您只需在 xml 可绘制对象上设置色调即可。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_back"
    android:tint="@color/red_tint"/>

如果您有无限数量的颜色,这可能不起作用,但如果颜色有限,这是一个非常好的选择。查看我的博客文章了解更多信息

于 2014-12-09T17:11:12.057 回答
0
Drawable d=clonebutton.getDrawable()
d.setColorFilter(0xFFFF0000,Mode.MULTIPLY);
clonebutton.setDrawable(d);

试试这个:或根据您的需要使用以下代码

 switch(v.getId())
{
case R.id.bt1:
    Drawable d=b11.getBackground();
    d.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY);

    b11.setBackgroundDrawable(d);
    b12.setBackgroundResource(android.R.drawable.btn_default);
break;

case R.id.bt2:
//b2.getBackground().setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY);
Drawable dd=b12.getBackground();
dd.setColorFilter(Color.CYAN,PorterDuff.Mode.MULTIPLY);

b12.setBackgroundDrawable(dd);
b11.setBackgroundResource(android.R.drawable.btn_default);
break;
}

onclick后切换按钮颜色

于 2013-03-28T12:45:33.283 回答