Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to dither a gradient drawable?

Tags:

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.

like image 383
Brandon O'Rourke Avatar asked May 07 '10 19:05

Brandon O'Rourke


People also ask

What is gradient drawable?

A GradientDrawable is drawable with a color gradient for buttons, backgrounds, etc.

What is angle in gradient Android?

It will come in the center of the screen. android:angle: It is a special angle and works only with the multiple of 45 including 0. So you can give 0, 45, 90, 135 and so on. Depending on the angle gradient position will change on the screen.

What is Android dither?

android:dither. Boolean. Enables or disables dithering of the bitmap if the bitmap does not have the same pixel configuration as the screen (for instance: a ARGB 8888 bitmap with an RGB 565 screen).


2 Answers

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.

like image 116
Dan Lew Avatar answered Sep 23 '22 16:09

Dan Lew


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 ?

like image 35
Mojo Risin Avatar answered Sep 20 '22 16:09

Mojo Risin