暂时改变可绘制的颜色

时间:2013-03-28 12:42:26

标签: java android

在我正在开发的一个应用中,我尝试以编程方式创建ImageButton,这是所选ImageButton的副本,但图像以不同的方式着色,让我们说红了。

如果我使用PowerDuff.Mode.MULTIPLY

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

然后,即使原始ImageButton将其颜色更改为红色,因为它们共享相同的drawable。有没有办法只在克隆按钮上应用过滤器而不使用两个不同的drawables?例如,是否可以在某种程度上将颜色层放在克隆按钮顶部而不编辑drawable

更新 我将drawable设置为可变:

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

这可以防止我的克隆按钮将其drawable的状态与其他views共享。

3 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分: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"/>

如果你有无限量的颜色,这可能不起作用,但如果它们有限,这是一个非常好的选择。 Check out my blog post for more information

答案 2 :(得分: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;
}

switching color of buttons after onclick