我正在将ColorFilter应用于Drawable
我想知道是否可以更改drawable的颜色但保留阴影。
这样的事情:
如果你申请了以下内容:
view.getBackground().setColorFilter(new PorterDuffColorFilter(itemView.getResources().getColor(R.color.green_500), PorterDuff.Mode.SRC_IN);
它将应用ColorFilter
但保留阴影和alpha值。
我怎样才能做到这一点?
答案 0 :(得分:3)
我认为你需要一个色调变换器。如果是这样,请使用Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue中提议的ColorFilterGenerator
,您只需:
view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(180));
结果如下(色调旋转180度):
注意:此答案的所有功劳必须归功于@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);