仅适用于Android 4.0及以上的色带

时间:2012-03-21 20:04:36

标签: android gradient surfaceview quantization dithering

在运行Android 4.0或4.0.3的模拟器上,我看到了可怕的色带,我似乎无法摆脱它。在我测试过的每个其他Android版本上,渐变看起来都很流畅。

我有一个配置为RGBX_8888的SurfaceView,并且渲染画布中不存在条带。如果我通过在渲染结束时叠加噪声模式来手动抖动图像,我可以使渐变再次平滑,但显然是以性能为代价,我宁愿避免。

所以后来正在引入条带。我只能假设,在4.0+上,我的SurfaceView在被绘制和显示之间的某个点被量化为较低的位深度,我可以从屏幕截图中看到,渐变是一次步进8个值每个频道,建议量化到555(而不是565)。

我将以下内容添加到我的Activity onCreate函数中,但它没有任何区别。

getWindow().setFormat(PixelFormat.RGBA_8888);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DITHER);

我也尝试将上面的内容放在onAttachedToWindow()上,但仍然没有变化。

(我相信RGBA_8888无论如何都是2.2及以上版本的默认窗口格式,因此明确设置该格式对4.0 +没有任何影响并不奇怪。)

这就留下了一个问题,如果源是8888而目的地是8888,那么引入量化/条带的原因是什么,它为什么只出现在4.0 +上?

非常令人费解。我想知道是否有人可以发光?

2 个答案:

答案 0 :(得分:2)

尝试dis ..

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));

答案 1 :(得分:0)

打开模拟器“使用主机GPU”选项为我修复了颜色问题,可以归功于这个答案https://stackoverflow.com/a/17166234/1287459

就我而言,我使用的是Android 4.2.2。