问题
This is the original button image. The background of the button was transparent.
When apply into apps, the button look like this. Please look at top left the button. The background of the button became gray instead of transparent.
Here is the Android version's button.
Not only the button but also all same type of buttons which background was transparent.
The custom_buttonfield
public class Custom_ButtonField extends ButtonField {
Bitmap mNormal;
Bitmap mFocused;
Bitmap mActive;
int mWidth;
int mHeight;
private int color = -1;
String text;
public Custom_ButtonField(Bitmap normal, Bitmap focused, Bitmap active) {
super(CONSUME_CLICK | Field.FOCUSABLE | Field.FIELD_HCENTER
| Field.FIELD_VCENTER);
mNormal = normal;
mFocused = focused;
mActive = active;
mWidth = mNormal.getWidth();
mHeight = mNormal.getHeight();
setMargin(0, 0, 0, 0);
setPadding(0, 0, 0, 0);
setBorder(BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
setBorder(VISUAL_STATE_ACTIVE,
BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
}
public Custom_ButtonField(String text, Bitmap normal, Bitmap focused,
Bitmap active, int color) {
super(CONSUME_CLICK | Field.FOCUSABLE | Field.FIELD_HCENTER
| Field.FIELD_VCENTER);
this.color = color;
mNormal = normal;
mFocused = focused;
mActive = active;
mWidth = mNormal.getWidth();
mHeight = mNormal.getHeight();
setMargin(0, 0, 0, 0);
setPadding(0, 0, 0, 0);
setBorder(BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
setBorder(VISUAL_STATE_ACTIVE,
BorderFactory.createSimpleBorder(new XYEdges(0, 0, 0, 0)));
this.text = text;
}
protected void onFocus(int direction) {
super.onFocus(direction);
}
protected void onUnfocus() {
super.onUnfocus();
}
protected void paint(Graphics graphics) {
int fontcontent;
if (Display.getWidth() > 480)
fontcontent = 28;
else if (Display.getWidth() < 481 && Display.getWidth() > 320)
fontcontent = 23;
else
fontcontent = 18;
Bitmap bitmap = null;
switch (getVisualState()) {
case VISUAL_STATE_NORMAL:
bitmap = mNormal;
break;
case VISUAL_STATE_FOCUS:
bitmap = mFocused;
break;
case VISUAL_STATE_ACTIVE:
bitmap = mActive;
break;
default:
bitmap = mNormal;
}
graphics.drawBitmap(0, 0, bitmap.getWidth(), bitmap.getHeight(),
bitmap, 0, 0);
graphics.setFont(Font.getDefault().derive(Font.BOLD, fontcontent));
graphics.setColor(color);
graphics.drawText(text, (mNormal.getWidth() - Font.getDefault()
.getAdvance(text)) / 2, ((mNormal.getHeight() - Font
.getDefault().getHeight()) / 2) + 10, DrawStyle.HCENTER
| DrawStyle.VCENTER);
}
public int getPreferredWidth() {
return mWidth;
}
public int getPreferredHeight() {
return mHeight;
}
protected void layout(int width, int height) {
setExtent(mWidth, mHeight);
}
}
The loader is here
private Bitmap news = Config_GlobalFunction.Bitmap("icon_news.png");
private Bitmap newsactive = Config_GlobalFunction
.Bitmap("icon_news_active.png");
if (left == 1) {
newsbtn = new Custom_ButtonField(news, newsactive, newsactive) {
protected boolean navigationClick(int status, int time) {
Main.getUiApplication().pushScreen(
new Menu_PopupMenu(thisid));
return true;
}
};
add(newsbtn);
} else if (left == 2) {
backbtn = new Custom_ButtonField(back, backctive, backctive) {
protected boolean navigationClick(int status, int time) {
Main.getUiApplication().popScreen(mainscreen);
return true;
}
};
add(backbtn);
}
if (left == 1) {
field = getField(1);
layoutChild(field, back.getWidth(), back.getHeight());
setPositionChild(field, 10, Height);
} else if (left == 2) {
field = getField(1);
layoutChild(field, news.getWidth(), news.getHeight());
setPositionChild(field, 10, Height);
}
if I set like this layoutChild(field, 60, 60);
, then it got no problem, the behind gray color no more. However, I cannot set fixed and must dynamic size.
回答1:
call this setBackground(BackgroundFactory.createBitmapBackground(bitmap));
instead of graphics.drawBitmap(0, 0, bitmap.getWidth(), bitmap.getHeight(),
bitmap, 0, 0);
in Custom_ButtonField
.
回答2:
I can't see the actual code that's loading the Bitmap
objects, but I know you were discussing it in the other question you posted. Try this:
Config_GlobalFunction.java:
public static Bitmap Bitmap(String name) {
Bitmap result;
// do whatever you do to load the Bitmap (e.g. Bitmap.getBitmapResource(name))
result.createAlpha(Bitmap.ALPHA_BITDEPTH_8BPP);
return result;
}
来源:https://stackoverflow.com/questions/11553286/ambiguous-of-the-custom-buttonfield