在运行Android 4.0或4.0.3的模拟器上,我看到了无法消除的可怕色带。在我测试过的所有其他Android版本上,渐变看起来都很平滑。

我有一个配置为RGBX_8888的SurfaceView,并且在渲染的 Canvas 中不存在条纹。如果我通过在渲染结束时叠加噪声图案来手动抖动图像,则可以使渐变再次平滑,尽管这样做显然会降低性能,但我宁愿避免这种情况。

因此,将在稍后介绍该 strip 。我只能假设在4.0+上,我的SurfaceView在绘制和显示之间的某个时刻被量化为较低的位深度,并且我从屏幕截图中可以看到,渐变每次一次步进8个值。每个 channel ,建议量化为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+上?

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

最佳答案

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

10-07 19:12