【问题标题】:Android - How to prevent ColorFilter with Porterduff.Mode.Screen from blending alpha?Android - 如何防止带有 Porterduff.Mode.Screen 的 ColorFilter 混合 alpha?
【发布时间】:2013-01-05 23:14:26
【问题描述】:

我的 GridView 中加载了一些图像,我想使用混合屏幕模式为它们应用微红色。

在我的适配器中,我有这个代码:

ImageView image = (ImageView) findViewById(...);
image.getDrawable().setColorFilter(channel.getSelectedColor(), Mode.SCREEN);

我也试过

image.setColorFilter(channel.getSelectedColor(), Mode.SCREEN);

但我总是得到这样的结果:

如果我使用Mode.Multiply,它不会为透明背景着色,但结果太暗了。是否可以使用Mode.Screen而不给透明部分着色?

我必须创建一个ColorMatrix 吗?有人能指出我正确的方向吗?

【问题讨论】:

  • 也许如果你去掉颜色的 alpha 分量:setColorFilter(channel.getSelectedColor() & 0x00ffffff, Mode.SCREEN)。只是猜测
  • 不,这似乎使颜色完全透明。

标签: android graphics drawable colormatrix porter-duff


【解决方案1】:

由于标准 Mode.SCREEN 也会更改 alpha,因此您始终可以使用仅混合 RGB 并单独保留 alpha 的自定义颜色矩阵。这是示例代码:

static ColorFilter screen(int c) {
    float r = Color.red(c) / 256f, g = Color.green(c) / 256f, b = Color.blue(c) / 256f;

    return new ColorMatrixColorFilter(new ColorMatrix(new float[]
            {
                    1 - r, 0, 0, 0, r, // r
                    0, 1 - g, 0, 0, g, // g
                    0, 0, 1 - b, 0, b, // b
                    0, 0, 0, 1, 0, // a
            }));
}

然后将其用作可绘制对象的颜色过滤器:

image.getDrawable().setColorFilter(screen(channel.getSelectedColor()));

很遗憾,此代码不起作用。看起来像当前版本的 Android 只是 ignore the rightmost column of the color matrix。源代码也证明了这一点 - it only uses 4x4 part of the original matrix

【讨论】:

    【解决方案2】:

    显然你也可以使用LightingColorFilter:

    static ColorFilter screen(int c) {
        return new LightingColorFilter(0xFFFFFFFF - c, c);
    }
    

    然后将其用作可绘制对象的颜色过滤器:

    image.getDrawable().setColorFilter(screen(channel.getSelectedColor()));
    

    这似乎行得通。

    【讨论】:

    • 这很好用!我有一个带有 alpha、白色和黑色的位图。使用此颜色过滤器的结果是颜色仅绘制在黑色之上。
    • 我只想用白色替换黑色像素,所以我做了view.setColorFilter(screen(Color.WHITE));,屏幕是return new LightingColorFilter(Color.BLACK - c, c);,但它使整个图像变成白色
    • @ono 你应该问一个单独的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多