在Android 4.0及以上版本中出现色带问题

13
在运行Android 4.0或4.0.3的模拟器上,我看到了可怕的色带问题,但似乎无法摆脱。在我测试过的其他所有Android版本中,渐变效果都很平滑。
我有一个SurfaceView,它被配置为RGBX_8888,并且在呈现画布时没有出现色带问题。如果我在渲染结束时通过叠加噪点来手动抖动图像,我可以使渐变效果再次变得平滑,但这会影响性能,而我不想这样做。
因此,色带问题是稍后引入的。我只能假设,在4.0+上,我的SurfaceView在绘制和显示之间的某个时刻被量化为更低的位深度,而从屏幕截图中可以看出,渐变效果每个通道都以8个值为步长,表明量化为555(而非565)。
我在Activity onCreate函数中添加了以下内容,但没有任何改善。
getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

我还尝试将上述内容放在onAttachedToWindow()中,但仍然没有变化。

(我相信在2.2及以上版本中,RGBA_8888是默认的窗口格式,因此明确设置该格式对4.0+没有影响也就不足为奇了。)

这就带来了一个问题,如果源是8888并且目标也是8888,那么是什么引入了量化/条带效应,并且为什么它只出现在4.0+上?

非常令人困惑。我想知道是否有人能够解决这个问题?


1
可能是重复的问题:ICS上的位图使用错误的像素格式加载 - Sergey Glotov
我遇到了完全相同的问题。我能够在v2.2+和v2.3+上解决这个问题,但是在v4.0+上无法解决。如果有人知道解决方案,我会很高兴知道。 - Sent1nel
1
我也遇到了这个问题,它搞乱了我的截屏。即使在内置壁纸上也能看到这个问题,所以问题的一部分明显是由于OpenGL ES模拟的副作用(根据错误消息,我只能运行软件渲染器。也许硬件渲染器可以减轻这个问题的影响?)在真实的Galaxy Nexus上我没有看到这样的恐怖景象。 - Falcon
1
PS:对于我来说,具有渐变背景的布局在“图形布局视图”中看起来很好。 - Code Poet
你能否在实际设备上测试一下,以确定这不仅仅是模拟器问题? - Shaun
显示剩余2条评论
2个回答

2

请尝试这个...

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap gradient = BitmapFactory.decodeResource(getResources(), R.drawable.gradient, options);

findViewById(R.id.main).setBackgroundDrawable(new BitmapDrawable(gradient));

0

一个注意事项:当使用“Host GPU”时,截图无法正常工作(它们会变成黑色)。 - Sébastien
在我的情况下起作用了...我这样做是为了能够在Google Play上获得一些好的截图。 - Georgie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接