Android 4.1.1上的ComposeShader问题

Eth*_*roy 15 android gradient canvas android-4.2-jelly-bean

我只是想为我的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);
Run Code Online (Sandbox Code Playgroud)

这是问题所在: 在此输入图像描述

(忽略Android 4.1.1下面的红色框.我只是谈论上面的渐变)

任何想法有什么不对?我认为我的代码中缺少一些东西,但我不知道,是什么.

编辑#1: 如果我只是用whiteMasksetShader,我也得到了两个系统不同的结果:通过梯度矩形照着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);
Run Code Online (Sandbox Code Playgroud)

因此,我们只有从任何颜色到黑色的垂直线性渐变和从黑色到白色的水平线性渐变.如果我们将这两个图层相乘,我们应该得到正确的矩形(如上面的左侧屏幕截图所示).但是在Android 4.1.1上我只看到了shader2的渐变.我也在Gimp中尝试了两层,结果与Android 2.3.7相同.

Eth*_*roy 20

发现问题:似乎它与硬件加速有关.如上所述这里 " ComposeShader只能包含不同类型的着色器(一个BitmapShader和实例的LinearGradient,而不是两个BitmapShader的实例) ".但是,' 如果您的应用程序受到任何这些缺失的功能或限制的影响,您可以通过调用关闭应用程序的受影响部分的硬件加速setLayerType(View.LAYER_TYPE_SOFTWARE, null)."

我看到,这个方法从SDK 11开始可用.我的应用程序支持从SDK 7开始的所有版本,所以我必须检查方法是否可用:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
    setLayerType(View.LAYER_TYPE_SOFTWARE, null);
}
Run Code Online (Sandbox Code Playgroud)

现在一切都很好.

  • 还有`ViewCompat.setLayerType(view,View.LAYER_TYPE_SOFTWARE,null);`support-v4库中的方法/调用. (2认同)