【问题标题】:Apply ColorFilter but preserve transparent shadow in PNG file应用 ColorFilter 但在 PNG 文件中保留透明阴影
【发布时间】:2016-01-29 09:18:03
【问题描述】:

我正在将 ColorFilter 应用于 Drawable 我想知道是否可以更改可绘制对象的颜色但保留其中的阴影。

类似这样的:

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

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 使用PorterDuff.Mode.CLEAR
  • 让我的drawable完全透明
  • @AndyRoid 您想将ColorFilter 应用到哪个视图?您使用的是 Android 支持库或任何类似库中的 FloatingActionButton

标签: android drawable colorfilter


【解决方案1】:

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

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

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

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

来自 cmets 的更新:

由于您需要指定目标颜色,您可以计算源和目标 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]));

请注意,这种方法只考虑颜色的色调值来改变它。

来自 cmets 的更新:

@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));

【讨论】:

  • 我以前一直在使用它,但似乎无法设置特定的颜色
  • @Jared Rummler 的回答非常出色。我赞成它
  • 将测试两者,几个月前我已经测试了 Jared 的答案,但也许我做错了什么感谢更新!两者都是出色的答案
  • 要清楚,我知道改变色调是通过旋转色调的角度来完成的,但在我的情况下,我需要完全设置一个特定的颜色并保留阴影和透明度。
  • 正如我在上次更新中所述,@Jared 的解决方案将您现有的可绘制对象作为参数,获取它的平均颜色并将其转换为您的目标颜色。而且他的方法不仅保留了阴影和透明度,还考虑到了饱和度和亮度(除了色相),这是主要原因,因为它太神奇了
【解决方案2】:

实现您想要的正确(并且可能是唯一)方法是将可绘制对象拆分为多个图层并使用 layerDrawable 组合它们。 此时,您可以拥有可以更改的颜色层(甚至不需要使用 porter duff)

【讨论】:

    【解决方案3】:

    我遇到了 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      相关资源
      最近更新 更多