Color banding only on Android 4.0+
Asked Answered
A

2

13

On emulators running Android 4.0 or 4.0.3, I am seeing horrible colour banding which I can't seem to get rid of. On every other Android version I have tested, gradients look smooth.

I have a SurfaceView which is configured as RGBX_8888, and the banding is not present in the rendered canvas. If I manually dither the image by overlaying a noise pattern at the end of rendering I can make the gradients smooth again, though obviously at a cost to performance which I'd rather avoid.

So the banding is being introduced later. I can only assume that, on 4.0+, my SurfaceView is being quantized to a lower bit-depth at some point between it being drawn and being displayed, and I can see from a screen capture that gradients are stepping 8 values at a time in each channel, suggesting a quantization to 555 (not 565).

I added the following to my Activity onCreate function, but it made no difference.

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

I also tried putting the above in onAttachedToWindow() instead, but there was still no change.

(I believe that RGBA_8888 is the default window format anyway for 2.2 and above, so it's little surprise that explicitly setting that format has no effect on 4.0+.)

Which leaves the question, if the source is 8888 and the destination is 8888, what is introducing the quantization/banding and why does it only appear on 4.0+?

Very puzzling. I wonder if anyone can shed some light?

Affricate answered 21/3, 2012 at 20:4 Comment(7)
possible duplicate of Bitmaps on ICS are loaded with wrong pixel formatPatchouli
Thanks for that link... does indeed look like the same problem. Some answers suggest that it may simply be an emulator problem and, although there's no definitive answer, I'm going to go with that for now.Affricate
I'm having the exact same problem. I was able to remove the issue on v2.2+ and v2.3+, but not v4.0+ I'd love to know if someone knows a solution to this?Tardigrade
I am having this problem too which messed up my captured screenshots. I am seeing this even on the built-in wallpapers so part of the problem is definitely due to artifacts of OpenGL ES emulation (according to error messages, i can only run software renderer. maybe hardware renderer will alleviate this problem?): I am seeing no such horror on a real Galaxy Nexus.Dancer
I'm having the same problem in the emulator. Neither getBackground().setDither(true) nor getWindow().setFormat(PixelFormat.RGBA_8888) worked. I also found a hardware property in the AVD - LCD Color Depth which defaults to 16 and set it to 32. No difference.Iconoduly
PS: For me, the layout with the gradient background looks fine in the Graphical Layout View.Iconoduly
Can/have you tested on an actual device to see if its not just an emulator issue?Tortilla
M
2

Try 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));
Ment answered 21/11, 2012 at 16:58 Comment(0)
S
0

Turning on the emulator "Use Host GPU" option fixed the color problems for me, credit goes to this answer https://mcmap.net/q/909146/-android-39-s-gradient-drawables-poor-quality-of-screenshots-in-eclipse

In my case I was using Android 4.2.2.

Squinch answered 30/7, 2013 at 6:14 Comment(2)
one caveat: screenshots do not work when using "Host GPU" (they come out black)Palpebrate
Worked in my case... I was doing this so I could get some good screenshots for Google Play.Squinch

© 2022 - 2024 — McMap. All rights reserved.