临时更改可绘制对象的颜色

6
在我正在开发的一个应用程序中,我试图以编程方式创建一个ImageButton,它是所选ImageButton的副本,但图像以不同的方式上色,比如变成红色。
如果我使用PowerDuff.Mode.MULTIPLY
clonebutton.getDrawable().setColorFilter(0xFFFF0000,Mode.MULTIPLY);

那么,即使原始的ImageButton改变颜色为红色,因为它们共享相同的drawable。有没有办法只在克隆按钮上应用过滤器,而不使用两个不同的drawables?例如,是否可能以某种方式在clonebutton上放置一个着色图层,而不编辑drawable

更新 我将可绘制对象设置为可变:

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

这会防止我的克隆按钮将其drawable的状态与其他views共享。
3个回答

16
Drawable buttonBackground = clonebutton.getDrawable();
buttonBackground = buttonBackground.mutate();
buttonBackground.setColorFilter(0xFFFF0000,Mode.MULTIPLY);
使这个可绘制对象变为可变的。此操作无法撤销。保证可变可绘制对象不会与其他可绘制对象共享状态。当需要修改从资源中加载的可绘制对象的属性时,这尤其有用。默认情况下,从同一资源加载的所有可绘制对象实例共享一个公共状态;如果您修改了一个实例的状态,则所有其他实例都将接收相同的修改。对可变 Drawable 调用此方法不会产生任何效果。

答案来得非常快,以至于我当时因为声望不够而无法接受它,但这绝对有效! - Vektor88

1
在棒棒糖版本中,如果您不想编程实现即色彩过滤器,则完全可以通过在xml drawable上设置色调来完成。
<?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"/>

如果你的颜色数量没有限制,这可能无法起作用,但如果它们受到限制,这是一个非常好的选择。查看我的博客文章获取更多信息

很棒的答案,我已经尝试过了,但是由于我使用了#000而不是#ff000000,所以它没有起作用。这个属性在棒棒糖中是被允许的,但并没有记录在案。他们应该添加这个。 - rekire

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;
}

点击按钮后切换颜色


在我的情况下,我想要给可绘制对象上色而不是背景。两个按钮共享相同的可绘制对象,但背景不同,这就解释了为什么它能够工作,但这并不是我想要实现的目标。 - Vektor88
你可以获取可绘制对象并将其存储在临时变量中,然后应用过滤器,然后在此处设置为背景。此外,按钮共享常见的Android资源ID Drawable。 - Athul Harikumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接