Drawable is not drawing on canvas

6

I have a custom view and a drawable to be drawn on it, but for some reason the drawable is not drawing itself on the view's canvas. Here's how the drawable is created:

int[] gradientColors=new int[] { 0xFFFF0000,0xFFFFFF00,0xFF00FF00,
        0xFF00FFFF,0xFF0000FF,0xFFFF00FF,0xFFFF0000 };
gradient=new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
        gradientColors);

And here's the onDraw function:

@Override protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);
    int width=canvas.getWidth();
    int height=canvas.getHeight();
    gradientBitmap=Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);
    canvas.setBitmap(gradientBitmap);
    gradient.setBounds(0,0,width,height);
    gradient.draw(canvas);
}
android
android-canvas
asked on Stack Overflow Jun 2, 2012 by user940016 • edited Dec 31, 2019 by Alexander Farber

1 Answer

3

Try to look at this code it can be helpful for you to learn haw to handle drawing for custom views:

public class MainActivity extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new SampleView(this));
        }

           private static class SampleView extends View {
                private Rect    mRect;
                private GradientDrawable mDrawable;

                public SampleView(Context context) {
                    super(context);
                    setFocusable(true);

                    mRect = new Rect(0, 0, 220, 120);

    /*              GradientDrawable.Orientation  BL_TR  draw the gradient from the bottom-left to the top-right   
                      BOTTOM_TOP  draw the gradient from the bottom to the top   
                      BR_TL  draw the gradient from the bottom-right to the top-left   
                      LEFT_RIGHT  draw the gradient from the left to the right   
                      RIGHT_LEFT  draw the gradient from the right to the left   
                      TL_BR  draw the gradient from the top-left to the bottom-right   
                      TOP_BOTTOM  draw the gradient from the top to the bottom   
                      TR_BL  draw the gradient from the top-right to the bottom-left   
    */

                    mDrawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
                                                     new int[] { 0xFFFF0000, 0xFF00FF00,
                                                         0xFF0000FF });
                    mDrawable.setShape(GradientDrawable.RECTANGLE);
                    mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60));
                }

                static void setCornerRadius(GradientDrawable drawable, float r0,
                                           float r1, float r2, float r3) {
    /*              setCornerRadii
                    Specify radii for each of the 4 corners. For each corner, 
                    the array contains 2 values, [X_radius, Y_radius]. 
                    The corners are ordered top-left, top-right, bottom-right, 
                    bottom-left 
    */
                    drawable.setCornerRadii(new float[] { r0, r0, r1, r1,
                                                          r2, r2, r3, r3 });
                }

                @Override protected void onDraw(Canvas canvas) {

                    mDrawable.setBounds(mRect);

                    float r = 35;

                    canvas.save();
                    canvas.translate(10, 10);
                    mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
                    setCornerRadius(mDrawable, r, r, 0, 0);
                    mDrawable.draw(canvas);
                    canvas.restore();

                    canvas.translate(0, mRect.height() + 10);
                    canvas.save();
                    canvas.translate(10, 10);
                    mDrawable.setGradientType(GradientDrawable.RADIAL_GRADIENT);
                    setCornerRadius(mDrawable, 0, 0, r, r);
                    mDrawable.draw(canvas);
                    canvas.restore();

                    canvas.translate(0, mRect.height() + 10);
                    canvas.save();
                    canvas.translate(10, 10);
                    mDrawable.setGradientType(GradientDrawable.SWEEP_GRADIENT);
                    setCornerRadius(mDrawable, 0, r, r, 0);
                    mDrawable.draw(canvas);
                    canvas.restore();


                }
            }
        }

UPDATE

public class MyView extends View {
    private static int measuredWidth = 300;
    private static int measuredHeight = 300;
    private Rect    mRect;
    private GradientDrawable mDrawable;

    public MyView(Context context) {
        super(context);
        initializeView();


    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        initializeView();
    }

    private void initializeView() {

        mDrawable = new GradientDrawable(GradientDrawable.Orientation.LEFT_RIGHT,
                new int[] { 0xFFFF0000,0xFFFFFF00,0xFF00FF00,
                0xFF00FFFF,0xFF0000FF,0xFFFF00FF,0xFFFF0000 });
        mDrawable.setShape(GradientDrawable.RECTANGLE);
        mDrawable.setGradientRadius((float)(Math.sqrt(2) * 60));
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        initializeView();
    }

    @Override protected void onDraw(Canvas canvas) {
        mRect = new Rect(0, 0, measuredWidth, measuredHeight);
        mDrawable.setBounds(mRect);
        canvas.save();
        canvas.translate(10, 10);
        mDrawable.setGradientType(GradientDrawable.LINEAR_GRADIENT);
        //setCornerRadius(mDrawable, r, r, 0, 0);
        mDrawable.draw(canvas);
        canvas.restore();

    }

I tried this for you it's based on your code and works except that i fixed the height and width:

answered on Stack Overflow Jun 2, 2012 by K_Anas • edited Jun 3, 2012 by K_Anas

User contributions licensed under CC BY-SA 3.0