首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >应用ColorFilter但在PNG文件中保留透明阴影

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

Stack Overflow用户
提问于 2016-01-29 17:18:04
回答 3查看 1.2K关注 0票数 6

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

如下所示:

如果你应用了类似这样的东西:

代码语言:javascript
复制
view.getBackground().setColorFilter(new PorterDuffColorFilter(itemView.getResources().getColor(R.color.green_500), PorterDuff.Mode.SRC_IN);

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

我如何才能做到这一点?

EN

回答 3

Stack Overflow用户

发布于 2016-06-07 22:28:44

我想你需要一个变色器。如果是这样的话,使用Understanding the Use of ColorMatrix and ColorMatrixColorFilter to Modify a Drawable's Hue中提出的ColorFilterGenerator,您只需执行以下操作:

代码语言:javascript
复制
view.getBackground().setColorFilter(ColorFilterGenerator.adjustHue(180));

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

注:这个答案的所有功劳都应该归功于@Richard Lalancette,因为他对我链接的问题的回答非常棒

来自评论的更新:

由于需要指定目标颜色,因此可以计算源HSV值和目标HSV值,并使用ColorFilterGenerator来改变色调。例如:

代码语言:javascript
复制
// 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)将您的可绘制作为参数,因此您不需要指定源颜色:

代码语言:javascript
复制
view.getBackground().setColorFilter(ColorFilterGenerator.from(view.getBackground()).to(Color.GREEN));
票数 3
EN

Stack Overflow用户

发布于 2016-06-02 19:16:22

实现所需功能的正确方法(可能也是唯一的方法)是将可绘制内容拆分成多个层,并使用layerDrawable将它们组合在一起。在这一点上,您可以拥有可以更改的颜色层(甚至不需要使用porter duff)

票数 1
EN

Stack Overflow用户

发布于 2019-09-21 22:05:45

我遇到了png和dropshadow的透明部分的问题,这段代码对我很有效。

代码语言:javascript
复制
  // 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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35080794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档