Reputation: 319
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:
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
Reputation: 20319
You need to make your call to super.onDraw(canvas)
the first thing you do, not the last.
Upvotes: 1