setColorFilter不工作

时间:2013-09-23 07:41:36

标签: android imageview colorfilter

我正在尝试在imageview上实现一个简单的colorfilter,将黑色图像变成白色图像。为了达到这个目的,我做了以下几点:

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

我也尝试将滤镜中的颜色更改为红色和白色,但所有这些都没有效果,我做错了什么?

10 个答案:

答案 0 :(得分:78)

尽管我讨厌回答自己的问题,但我发现了问题: 我应该使用:

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

答案 1 :(得分:26)

这取决于您要应用的过滤类型。如果你想在带有透明胶片的图像上应用新颜色,这对我有用:

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

如果你想了解更多关于这个PorterDuff过滤器的信息,我发现了一篇帮助我理解的goog文章:http://www.ibm.com/developerworks/java/library/j-mer0918/给它一个读数:)

答案 2 :(得分:18)

在Android 6上遇到同样的问题。使用ImageView.getDrawable().setColorFilter()代替ImageView.setColorFilter()解决了问题。

答案 3 :(得分:4)

我们使用此代码

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

答案 4 :(得分:3)

我在运行4.3的Samsung S3上遇到了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似乎没有任何效果。

答案 5 :(得分:2)

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

image.setColorFilter(Color.BLACK, PorterDuff.Mode.MULTIPLY);
image.setImageResource(R.drawable.img);
如果R.drawable.img是矢量图像,

过滤器适用,并且对栅格资源无效

答案 6 :(得分:2)

对我来说,仅在setColorFilter()上调用ImageView是行不通的。

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+

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

答案 8 :(得分:0)

使用乘法时遇到相同的问题

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

这适用于png图标,但不适用于矢量图形。 将其更改为默认值可同时适用于两种情况:

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

答案 9 :(得分:0)

在您尝试更改不属于预定义颜色的颜色(例如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();
            }
        });

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