50

我正在尝试在图像视图上实现一个简单的滤色器,以将黑色图像变成白色图像。为了实现这一点,我执行以下操作:

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

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

4

10 回答 10

96

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

   weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
于 2013-09-23T07:45:15.643 回答
30

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

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

如果您想了解有关此 PorterDuff 过滤器的更多信息,我发现了一篇帮助我理解的 goog 文章: http: //www.ibm.com/developerworks/java/library/j-mer0918/阅读一下 :)

于 2014-09-18T11:33:04.210 回答
21

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

于 2016-03-03T16:58:19.187 回答
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);
    }
于 2017-03-14T04:41:22.760 回答
5

对我来说,简单地调用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+
于 2018-08-27T18:32:55.170 回答
3

setColorFilter我在运行 4.3 的三星 S3 上遇到问题,我可以让过滤器工作的唯一方法是在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);
}

简单地应用于setColorFilterBitmapDrawable 似乎没有任何效果。

于 2016-04-06T11:03:53.527 回答
3

我在使用乘法时遇到了同样的问题

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

这适用于 png 图标,但不适用于矢量图形。将其更改为默认值适用于两者:

 weatherImg.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);
于 2019-09-13T08:46:19.780 回答
2

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

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

如果是矢量图像,则应用过滤器R.drawable.img,并且对光栅资源没有影响

于 2016-12-16T08:22:18.663 回答
1

对于 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);
于 2018-02-15T20:45:08.137 回答
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();
            }
        });

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

于 2020-12-02T20:59:53.923 回答