Is it possible to dither a gradient drawable?
Asked Answered
P

3

21

I'm using the following drawable:

<?xml version="1.0" encoding="utf-8"?>
<shape 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >

    <gradient 
        android:startColor="@color/content_background_gradient_start"
        android:endColor="@color/content_background_gradient_end" 
        android:angle="270"
        />

</shape>

The problem is that I get severe banding on hdpi devices (like the Nexus One and Droid) since the gradient goes from the top of the screen to the very bottom.

According to http://idunnolol.com/android/drawables.html#shape_gradient there isn't a "dither" attribute for a gradient. Is there anything I can do to smooth the gradient?

Note: adding dither="true" to shape doesn't seem to work.

Paulino answered 7/5, 2010 at 19:5 Comment(0)
H
11

I wrote the documentation you referenced. I've taken another look at the code and unfortunately there's no way to enable dithering on a GradientDrawable except by explicitly calling GradientDrawable.setDither() in code.

(The way the codes looks, technically you could include the Gradient as the only child of a <selector>, and enable dithering on the entire selector; however, it's definitely a hack.)

I'm not convinced enabling dithering will actually solve your problem, as dithering (at least as it's noted in the official Android docs) are for solving banding problems when the device has too small of a color palette. This seems to be a banding problem due to the size of the gradient.

Hoke answered 7/5, 2010 at 21:36 Comment(0)
P
7

Hi all i have the same problem, there is one solution which works but it's not very good.

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

It works for me but the problem is that the whole windows is dithered. I was looking to find a way to dither only the gradient but i couldn't find anything. android:dither="true" in xml is not working and GradientDrawable.setDither(true) is also not working. So any ideas how can i dither only the gradient ?

Polynomial answered 23/7, 2010 at 9:9 Comment(1)
The selected answer didn't help me, yours did! Have a Galaxy S with Android 2.2.Dicarlo
C
2

I faced a very similar problem last year and came to no useful conclusion on the android-developers list.

However, a while ago I discovered — after trying <gradient> and all sorts of Drawables with various dither attributes and manually creating dithered PNGs — that if I manually create a new image using GIMP, and specify the density at this point (i.e. explicitly entering 120, or 240 etc) when creating the image, it looks great, even on hdpi devices. And this is despite it being a grayscale gradient, with not so many colours.

The PNG when saved ends up being comparatively large (at least for 240dpi), but it looks great.

Cinquain answered 7/5, 2010 at 23:12 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.