繁体   English   中英

暂时更改可绘制颜色

[英]Temporarily change drawable color

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

如果我使用PowerDuff.Mode.MULTIPLY

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

然后,即使原始的ImageButton将其颜色更改为红色,因为它们共享相同的drawable 有没有一种方法可以仅在clonebutton上应用过滤器,而不使用两个不同的drawables 例如,是否可以在不编辑drawable情况下将颜色化层放在clonebutton的顶部?

更新我将drawable设置为可变的:

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

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

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

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

在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"/>

如果您的颜色数量有限,则可能无法使用,但如果颜色有限,这是一个很好的选择。 查看我的博客文章以获取更多信息

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后切换按钮的颜色

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM