setColorFilter无法工作

51

我正在尝试在ImageView上实现简单的颜色过滤器,将黑色图像转换为白色图像。为了实现这一点,我执行以下操作:

我试图在ImageView上实现一个简单的颜色过滤器,将黑色图像变成白色图像。为了达到这个目的,我做了以下步骤:

    weatherImg.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
    weatherImg.setImageResource(R.drawable.b_clouded_rain);

我也尝试将颜色过滤器中的颜色更改为红色和白色,但它们都没有效果,我做错了什么?

10个回答

97
尽管我不太愿意回答自己的问题,但我找到了问题所在: 我应该使用:

   weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

11
PorterDuff.Mode.SRC_ATOP 是默认使用的模式,weatherImg.setColorFilter(Color.WHITE) 也可以使用。 - GuilhE

30

这取决于您想要应用哪种类型的过滤器。如果您想在带有透明度的图像上应用新的颜色,则以下是我使用的方法:

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);

如果您想了解有关 PorterDuff 过滤器的更多信息,我找到了一篇很好的文章可以帮助您理解:http://www.ibm.com/developerworks/java/library/j-mer0918/。建议您阅读一下 :)


21

在Android 6上遇到了相同的问题。通过使用ImageView.getDrawable().setColorFilter()而不是ImageView.setColorFilter()进行解决。


不适合适配器项目,因为如果您不断修改后端列表,则每次都必须创建新的“ColorFilter”对象。 - TheRealChx101
@TheRealChx101 在适配器项中设置可绘制对象的setColor的正确方法是什么? - WHOATEMYNOODLES

6

对我而言,在ImageView上简单调用setColorFilter()并不起作用。

imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) //didnt work on 21, only 22+

无论出于什么原因,在API 21上,我只能通过将更改发布到视图消息队列中才能使setColorFilter()正常工作。
imageView.post { imageView.setColorFilter(ResourcesCompat.getColor(resources, color, null)) } //this works on 21+

6
我们使用这段代码。
Drawable drawable = DrawableCompat.wrap(getDrawable(drawableResource));
        drawable.mutate();
        DrawableCompat.setTint(drawable, getColor(color));
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

public static int getColor(int id) {
        return ContextCompat.getColor(getInstance().context, id);
    }

public static Drawable getDrawable(int id) {
        return ContextCompat.getDrawable(getInstance().context, id);
    }

正是我所需要的。 - aryaxt

3

我在三星S3上运行4.3时遇到了setColorFilter的问题,唯一能使滤镜起作用的方法是在draw(Canvas canvas)方法中应用它:

public class ColouredDrawable extends BitmapDrawable {

private ColorFilter mColorFilter;

public ColouredDrawable(Bitmap toTransform, int toColour, Resources resources) {
    super(resources, toTransform);
    float[] matrix = {
            0, 0, 0, 0, ((toColour & 0xFF0000) / 0xFFFF),
            0, 0, 0, 0, ((toColour & 0xFF00) / 0xFF),
            0, 0, 0, 0, (toColour & 0xFF),
            0, 0, 0, 1, 0 };
    mColorFilter = new ColorMatrixColorFilter(matrix);
}

@Override
public void draw(Canvas canvas) {
    setColorFilter(mColorFilter);
    super.draw(canvas);
}

简单地将 setColorFilter 应用于 BitmapDrawable 似乎没有任何效果。

S4 4.4.4 上也有同样的问题。 - Simas
我也有两个三星设备在4.3和4.4.4上出现了同样的问题!这真的很糟糕! - sud007
1
在Android Lollipop之前也是一样。NinePatchDrawable也受到影响。我通过覆盖drawable类并在draw方法中将colorFilter设置为paint对象来解决了这个问题: @Override public void draw(Canvas canvas) { getPaint().setColorFilter(your_colorFilter); super.draw(canvas); } - Venator85
我也遇到了4.3和4.4的问题。正确的答案是使用DrawableCompat。请参见我的解决方案:https://dev59.com/iWMk5IYBdhLWcg3wyw_H#48815950。 - methodsignature

3

当我使用乘法时,我遇到了同样的问题。

weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.MULTIPLY);

这种方法适用于png图标,但不适用于矢量图形。将其更改为默认值可同时适用于两种情况:
 weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

2

对我来说,只有这个解决方案可行:

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);

如果 R.drawable.img 是矢量图像,则此过滤器适用,对于光栅资源没有影响。


1
我可能和你的问题不完全相同,但当我尝试更改不属于预定义颜色(如YELLOW>BLUE>GRAY和其他几个颜色)的颜色时,它们很相似。在使用ColorFiler时,无论我尝试使用什么颜色,都会得到相同的结果。因此,当我使用...
imageView3.setColorFilter(0x85ffdd , PorterDuff.Mode.MULTIPLY);

我一开始也遇到了同样的黑色问题 后来我找到了

int color = Color.parseColor("#85ffdd"); 

现在我没有使用任何颜色的问题。

imageView3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int color = Color.parseColor("#85ffdd");
                imageView3.setColorFilter(color, PorterDuff.Mode.MULTIPLY);
                //get other images to default
                imageView1.clearColorFilter();
                imageView2.clearColorFilter();
            }
        });

我希望它可以帮助你或其他人。


0

对于 Android 4.3 和 4.4,setColorFilter 不起作用。请改用 DrawableCompat。

    val drawable = DrawableCompat.wrap(ContextCompat.getDrawable(
            context,
            R.drawable.b_clouded_rain));
    DrawableCompat.setTint(drawable, foregroundColor);
    DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_IN)
            .setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);

    weatherImg.setImageResource(R.drawable.b_clouded_rain);

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