我只是想为我的 android 应用程序实现一个颜色选择器,并在 Android 4.1.1 上遇到了一个奇怪的问题。以下代码不会在 Android 4.1.1 上创建预期的渐变,但会在 2.3.7 上创建:
Shader fadeInRight = new LinearGradient(0, 0, pWidth, 0, 0x00000000, 0xFF000000, Shader.TileMode.CLAMP);
Shader blackToWhite = new LinearGradient(0, 0, 0, pHeight, 0xFF000000, 0xFFFFFFFF, Shader.TileMode.CLAMP);
Shader whiteMask = new ComposeShader(blackToWhite, fadeInRight, PorterDuff.Mode.DST_IN);
Shader blackToColor = new LinearGradient(0, 0, pWidth, 0, 0xFF000000, hue, Shader.TileMode.CLAMP);
Shader shader = new ComposeShader(blackToColor, whiteMask, PorterDuff.Mode.SCREEN);
paint.setShader(shader);
...
canvas.drawRect(new Rect(0, 0, pWidth, pHeight), paint);
这是问题所在:
(Android 4.1.1忽略下面的红框,我只说上面的渐变)
有什么想法吗?我认为我的代码中缺少一些东西,但我不知道是什么。
编辑#1:
如果我只使用whiteMask
for setShader
,我也会得到两个系统的不同结果:在 2.3.7 上,我可以看到配置菜单的文本(位于弹出窗口后面)通过渐变矩形闪烁。此外,从左上边缘到右下边缘有一个渐变(从黑色到白色),但是 4.1.1 上的渐变是从左到右水平的。所以这似乎是一个问题ComposeShader
编辑#2: 我找到了一个更简单的例子来描述这个问题:
Shader shader1 = new LinearGradient(0, 0, 0, pHeight, hue, 0xffffffff, Shader.TileMode.CLAMP);
Shader shader2 = new LinearGradient(0, 0, pWidth, 0, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP);
Shader shader = new ComposeShader(shader1, shader2, PorterDuff.Mode.MULTIPLY);
所以,我们只有一个从任何颜色到黑色的垂直线性渐变和一个从黑色到白色的水平线性渐变。如果我们将这两个层相乘,我们应该得到正确的矩形(如上左截图所示)。但在 Android 4.1.1 上,我只看到 shader2 的渐变。我还在 Gimp 中尝试了两层,结果与 Android 2.3.7 相同。