我在GridView中加载了一些图像,我想使用混合的屏幕模式为它们应用偏红色。
在我的适配器中,我有这段代码:
ImageView image = (ImageView) findViewById(...);
image.getDrawable().setColorFilter(channel.getSelectedColor(), Mode.SCREEN);
我也试过
image.setColorFilter(channel.getSelectedColor(), Mode.SCREEN);
但我总是最终得到这样的东西:
如果我使用Mode.Multiply
,它不会为透明背景着色,但结果太暗了。是否可以使用Mode.Screen
而不对透明部分着色?
我是否必须创建ColorMatrix
?有人能指出我正确的方向吗?
答案 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。