How to draw a smooth/dithered gradient on a canvas in Android
Asked Answered
D

1

39

Several answers mention to use GradientDrawable.setDither(true) to draw smooth gradients in Android. That has no effect in my code. Any idea what I have to change to get a well looking gradient in my live wallpaper?

GradientDrawable gradient = new GradientDrawable(Orientation.TL_BR, colors);
gradient.setGradientType(GradientDrawable.RADIAL_GRADIENT);
gradient.setGradientRadius(canvas.getWidth() * 2);
gradient.setDither(true);
gradient.setGradientCenter(-0.1f, -0.1f);
gradient.setBounds(cb);
gradient.draw(canvas);
Dorweiler answered 29/5, 2010 at 22:29 Comment(0)
N
85

Seeing as you have a Canvas to work with. Here is one option.

private Bitmap makeRadGrad() {
    RadialGradient gradient = new RadialGradient(200, 200, 200, 0xFFFFFFFF,
            0xFF000000, android.graphics.Shader.TileMode.CLAMP);
    Paint p = new Paint();
    p.setDither(true);
    p.setShader(gradient);

    Bitmap bitmap = Bitmap.createBitmap(400, 400, Config.ARGB_8888);
    Canvas c = new Canvas(bitmap);
    c.drawCircle(200, 200, 200, p);

    return bitmap;
}

Result:

Result

Nullification answered 29/10, 2011 at 16:21 Comment(2)
What I do not fully understand is why do you have to define coordinates (200, 200, 200) two times. What should I do to dynamically adjust the position and most importantly SIZE of the gradient in onDraw() method ?Eschalot
The first coordinates define the size of the gradient, the second set of coordinates describes the size of the circle containing the gradient. If the coordinates are not the same the gradient would not fill the circle or would get cut off by the circle bounds.Hedgepeth

© 2022 - 2024 — McMap. All rights reserved.