我正在对一个Drawable应用一个ColorFilter,我想知道是否有可能改变可绘制的颜色,但保留其中的阴影。
如下所示:

如果你应用了类似这样的东西:
view.getBackground().setColorFilter(new PorterDuffColorFilter(itemView.getResources().getColor(R.color.green_500), PorterDuff.Mode.SRC_IN);它将应用ColorFilter,但保留阴影和Alpha值。
我如何才能做到这一点?
发布于 2016-06-07 22:28:44
我想你需要一个变色器。如果是这样的话,使用Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue中提出的ColorFilterGenerator,您只需执行以下操作:
view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(180));结果如下所示(色调旋转180度):

注:这个答案的所有功劳都应该归功于@Richard Lalancette,因为他对我链接的问题的回答非常棒
来自评论的更新:
由于需要指定目标颜色,因此可以计算源HSV值和目标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)将您的可绘制作为参数,因此您不需要指定源颜色:
view.getBackground().setColorFilter(ColorFilterGenerator.from(view.getBackground()).to(Color.GREEN));发布于 2016-06-02 19:16:22
实现所需功能的正确方法(可能也是唯一的方法)是将可绘制内容拆分成多个层,并使用layerDrawable将它们组合在一起。在这一点上,您可以拥有可以更改的颜色层(甚至不需要使用porter duff)
发布于 2019-09-21 22:05:45
我遇到了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);https://stackoverflow.com/questions/35080794
复制相似问题