Maarten
Maarten

Reputation: 319

Android Button subclassing with custom background

I've been having this issue and figuring out how to fix it for a few days now, here is my problem:

I have a class called GuiButton, which extends android.widget.Button. I override the onDraw method to draw my own bitmap as background since i also had problems getting android to draw (and switch between when pressed) a button background the way i wanted it with the setBackgroundDrawable() method.

Long story short, whever the button appears on screen, it has a black background the entire area of the button and on top of that my own button graphic is drawn. This is a problem since the button has an alpha channel and is transparent in the middle and at the edges and the button is drawn on top of a background that has "slots" for the button, so with the black background auto-drawing, part of this background isnt visible and the button looks ugly.

Here is my draw code, if you need to know anything else please ask and Ill provide.

@Override
    public void onDraw(Canvas canvas) 
    {
        // Create a new paint
        Paint paint = new Paint();

        // Apply the filter flag for when the bitmap gets 
        // scaled on different screen sizes
        paint.setFlags(Paint.FILTER_BITMAP_FLAG);

        // Clear the canvas
        canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
        if(_pressed)
        {
            canvas.drawBitmap(_pressedBitmap, null, new Rect(0,0,this.getWidth(),this.getHeight()), paint);
        }
        else
        {
            canvas.drawBitmap(_normalBitmap, null, new Rect(0,0,this.getWidth(),this.getHeight()), paint);
        }

        super.onDraw(canvas);
    }

Yeah, that fixes the problem of the black background, however it creates a bunch more:

1: The text on the button now gets drawn below the bitmap. Ergo, you can't see it.

2: The background of the button is now ALWAYS the first "background.png" i draw on it. When I press the button, the "regular"background gets drawn and on top of that the "pressed state" background. However, this looks ugly since they both contain an alpha channel in different positions. This means the "normal button" is still partially visible trough the transparent parts of the "pressed button".

Here is an example (with ugly simplified images to illustrate the problem):

Normal button: Normal Button

Pressed Button: Pressed Button

As you can see, the normal (blue) button always draws. I also checked the If Else statement in my onDraw method, but it never reaches the draw code for the "normal" button if the button is pressed. So for some reason, the button is still in memory or something :S.

Upvotes: 0

Views: 1505

Answers (1)

slayton
slayton

Reputation: 20319

You need to make your call to super.onDraw(canvas) the first thing you do, not the last.

Upvotes: 1

Related Questions