2013-03-28 92 views
6

在我正在开发的一个应用程序中,我试图以编程方式创建一个ImageButton,它是所选ImageButton的副本,但图像以不同的方式着色,比方说红色。暂时更改可绘制颜色

如果我使用PowerDuff.Mode.MULTIPLY

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

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

更新 我设置为绘制可变:

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

这可以防止我clonebutton分享其drawable的状态通知给其他views

回答

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

将此绘制可变的。这个操作不能逆转。 A 可变的可绘制保证不与其他任何 可绘制的状态共享。这在您需要修改从资源加载的可绘制的属性 时特别有用。默认情况下,从同一资源加载的所有可绘制实例共享一个公共状态;如果您修改了一个实例的状态 ,则所有其他实例都会收到 相同的修改。在可变Drawable上调用此方法将不会产生任何影响。

+0

这个共同和可缩放的绘图工作,完美无瑕! – Vektor88

+0

答案来得太快,以至于我在那个时候无法接受它,因为我的声望很低,但这绝对有效! – Vektor88

+0

:)........不用担心 – Triode

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

+0

因为引用的drawable是相同的,所以这不起作用。 – Vektor88

+0

你检查了第二个代码,因为它已经为我工作了 –

+0

在我的情况下,我想着色绘制而不是背景。两个按钮共享相同的可绘制但不相同的背景,这解释了为什么它可以工作,但它不是我想要实现的 – Vektor88

1

在棒棒糖上,如果你不想这样做,你就不需要做这个编程,即colorfilters。你可以通过在xml drawable上设置一个色调来完成。如果你有一个颜色unlimiited数

<?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

+0

伟大的答案我已经试过这个,但它没有工作,因为我使用'#000'而不是'#ff000000'。这个属性在棒棒糖中是允许的也没有记录。他们应该添加这个。 – rekire

相关问题