Android - 如何防止ColorFilter与Porterduff.Mode.Screen混合alpha?

时间:2013-01-22 16:32:06

标签: android graphics drawable colormatrix porter-duff

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

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

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

我也试过

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

但我总是最终得到这样的东西: Alpha channel is red

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

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

2 个答案:

答案 0 :(得分:3)

显然,您也可以使用LightingColorFilter

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

然后将其用作drawable的颜色过滤器:

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

这似乎有效。

答案 1 :(得分:-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
            }));
}

然后将其用作drawable的颜色过滤器:

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

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