应用ColorFilter但在PNG文件中保留透明阴影

时间:2016-01-29 09:18:04

标签: android drawable colorfilter

我正在将ColorFilter应用于Drawable我想知道是否可以更改drawable的颜色但保留阴影。

这样的事情:

enter image description here

如果你申请了以下内容:

view.getBackground().setColorFilter(new PorterDuffColorFilter(itemView.getResources().getColor(R.color.green_500), PorterDuff.Mode.SRC_IN);

它将应用ColorFilter但保留阴影和alpha值。

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

我认为你需要一个色调变换器。如果是这样,请使用Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue中提议的ColorFilterGenerator,您只需:

view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(180));

结果如下(色调旋转180度):

enter image description here

注意:此答案的所有功劳必须归功于@Richard Lalancette,因为他对我链接的问题的回答很棒

从评论中更新:

当您需要指定目标颜色时,您可以计算源和目标HSV值,并使用ColorFilterGenerator来移动色调。例如:

// Your source color (The RGB color from your original image is 255,85,78)
float[] hsvSource = new float[3];
Color.RGBToHSV(255, 85, 78, hsvSource);

// The color whose hue you want to achieve (green for example)
float[] hsvTarget = new float[3];
Color.RGBToHSV(0, 200, 18, hsvTarget);

view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(hsvTarget[0] - hsvSource[0]));

请注意,此方法仅考虑颜色的色调值来移动它。

从评论中更新:

@Jared Rummler的精彩回答(Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue)将您的drawable作为参数,因此您不需要指定源颜色:

view.getBackground().setColorFilter(ColorFilterGenerator.from(view.getBackground()).to(Color.GREEN));

答案 1 :(得分:1)

实现您想要的正确(也可能是唯一)方法是将drawable分成多个层并使用layerDrawable来组合它们。 此时你可以拥有你可以改变的颜色层(你甚至不需要使用搬运工duff)

答案 2 :(得分:0)

我面临png和dropshadow透明部分的问题,此代码对我有用。

  // The colorPrimary is color you want to achieve 
    float colorRed = Color.red(colorPrimary) / 255f;
    float colorGreen = Color.green(colorPrimary) / 255f;
    float colorBlue = Color.blue(colorPrimary) / 255f;

    drawable.setColorFilter(new ColorMatrixColorFilter(new ColorMatrix(new float[]{
            1 - colorRed, 0,              0,             0,     colorRed * 255,
            0,            1 - colorGreen, 0,             0,     colorGreen * 255,
            0,            0,              1 - colorBlue, 0,     colorBlue * 255,
            0,            0,              0,             Color.alpha(colorPrimary) / 255f, 0,
    })));
    img.setImageDrawable(drawable);