我正在尝试将LabelField的背景设置为透明,并且我在搜索范围内寻找解决方案,但到目前为止我所尝试的内容似乎都没有用。基本上我的问题如下,我有一个TableFow的ListField,我将标签添加到表行管理器,然后在表行管理器的绘制行中绘制它们。但我正在实例化我的LabelField,如下所示:
LabelField address = new LabelField(e.Address, DrawStyle.ELLIPSIS
| FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
public int getPreferredWidth() {
return Display.getWidth() - 100;
}
protected void layout(int maxWidth, int maxHeight) {
super.layout(getPreferredWidth(), maxHeight);
setExtent(getPreferredWidth(), getHeight());
}
};
address.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
上面给了我一个黑色背景的LabelField很好,直到我把焦点放在那一行上,我不能用黑色进行onFocus覆盖,因为我需要让用户知道他目前关注的位置
修改
我将上面的代码更改为:
LabelField name = new LabelField(e.Name,
DrawStyle.ELLIPSIS | FOCUSABLE){
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
};
因为他在回答中说LabelField和EditField有默认的透明背景,所以你错了:
这是我的完整代码:
import java.util.Vector;
import net.rim.device.api.collection.List;
import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.Manager;
import net.rim.device.api.ui.XYRect;
import net.rim.device.api.ui.component.BitmapField;
import net.rim.device.api.ui.component.Dialog;
import net.rim.device.api.ui.component.LabelField;
import net.rim.device.api.ui.component.ListField;
import net.rim.device.api.ui.component.ListFieldCallback;
import net.rim.device.api.ui.decor.BackgroundFactory;
public class SpecialsListField extends ListField implements ListFieldCallback {
private Bitmap p1;
TableRowManager row;
Vector rows;
public SpecialsListField(List list) {
/* Init & Declaration */
setEmptyString("This ListField has No Data", DrawStyle.HCENTER);
setCallback(this);
setRowHeight(179);
Font.getDefault();
p1 = Bitmap.getBitmapResource("no-image.png");
rows = new Vector();
for (int x = 0; x < list.size(); ++x) {
Special e = (Special) list.getAt(x);
row = new TableRowManager();
BitmapField myImageField = new BitmapField(p1);
row.add(myImageField);
LabelField name = new LabelField(e.Name, DrawStyle.ELLIPSIS
| FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
};
name.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
row.add(name);
LabelField date = null;
if (e.DateFrom.compareTo(e.DateTo) == 0) {
date = new LabelField(e.DateFrom, DrawStyle.ELLIPSIS
| FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
};
date.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
row.add(date);
} else {
date = new LabelField(e.DateFrom + " - " + e.DateTo,
DrawStyle.ELLIPSIS | FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
};
date.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
row.add(date);
}
LabelField time = null;
if (e.TimeFrom.compareTo(e.TimeTo) == 0) {
time = new LabelField(e.TimeFrom, DrawStyle.ELLIPSIS
| FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
};
time.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
row.add(time);
} else {
time = new LabelField(e.TimeFrom + " - " + e.TimeTo,
DrawStyle.ELLIPSIS | FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
};
time.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
row.add(time);
}
LabelField address = new LabelField(e.Address, DrawStyle.ELLIPSIS
| FOCUSABLE) {
public void paint(Graphics g) {
g.setGlobalAlpha(255);
g.setColor(Color.WHITE);
g.clear();
super.paint(g);
}
protected void paintBackground(Graphics g) {
g.setGlobalAlpha(0);
g.setBackgroundColor(Color.BLACK);
g.clear();
super.paint(g);
}
public int getPreferredWidth() {
return Display.getWidth() - 100;
}
protected void layout(int maxWidth, int maxHeight) {
super.layout(getPreferredWidth(), maxHeight);
setExtent(getPreferredWidth(), getHeight());
}
};
address.setBackground(BackgroundFactory
.createSolidTransparentBackground(0, 0));
row.add(address);
rows.addElement(row);
}
setSize(rows.size());
}
public void drawListRow(ListField listField, Graphics graphics, int index,
int y, int width) {
// TODO Auto-generated method stub
SpecialsListField list = (SpecialsListField) listField;
TableRowManager rowManager = (TableRowManager) list.rows
.elementAt(index);
rowManager.drawRow(graphics, 0, y, width, 179);
}
protected void drawFocus(Graphics graphics, boolean on) {
// get the focus rect area
XYRect focusRect = new XYRect();
getFocusRect(focusRect);
boolean oldDrawStyleFocus = graphics
.isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS);
try {
if (on) {
// set the style so the fields in the row will update its color
// accordingly
graphics.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS, true);
int oldColour = graphics.getColor();
try {
graphics.setColor(Color.DARKGRAY); // set the color and draw
// the
// color
graphics.fillRect(focusRect.x, focusRect.y,
focusRect.width, focusRect.height);
} finally {
graphics.setColor(oldColour);
}
// to draw the row again
drawListRow(this, graphics, getSelectedIndex(), focusRect.y,
focusRect.width);
}
} finally {
graphics.setDrawingStyle(Graphics.DRAWSTYLE_FOCUS,
oldDrawStyleFocus);
}
}
public Object get(ListField listField, int index) {
// TODO Auto-generated method stub
return rows.elementAt(index).toString();
}
public int getPreferredWidth(ListField listField) {
// TODO Auto-generated method stub
return Graphics.getScreenWidth();
}
public int getRowHeight() {
// TODO Auto-generated method stub
return 179;
}
public int getRowHeight(int arg0) {
// TODO Auto-generated method stub
return 179;
}
public int indexOfList(ListField listField, String prefix, int start) {
// TODO Auto-generated method stub
return -1;
}
protected boolean trackwheelClick(int status, int time) {
int index = getSelectedIndex();
Dialog.inform(Integer.toString(index));
return true;
}
private class TableRowManager extends Manager {
public TableRowManager() {
super(0);
}
// Causes the fields within this row manager to be layed out then
// painted.
public void drawRow(Graphics g, int x, int y, int width, int height) {
// Arrange the cell fields within this row manager.
layout(width, height);
// Place this row manager within its enclosing list.
setPosition(x, y);
// Apply a translating/clipping transformation to the graphics
// context so that this row paints in the right area.
g.pushRegion(getExtent());
// Paint this manager's controlled fields.
subpaint(g);
/*
* g.setColor(0xFF0000); g.drawLine(0, height - 1,
* getPreferredWidth(), height - 1); g.drawLine(40, 0, 40,
* getPreferredHeight());
*/
// Restore the graphics context.
g.popContext();
}
// Arrages this manager's controlled fields from left to right within
// the enclosing table's columns.
protected void sublayout(int width, int height) {
// set the size and position of each field.
int fontHeight = Font.getDefault().getHeight();
int preferredWidth = getPreferredWidth();
// start with the Bitmap Field of the priority icon
Field field = getField(0);
layoutChild(field, 75, 75);
setPositionChild(field, 5, 5);
// set the task name label field
field = getField(1);
layoutChild(field, preferredWidth, fontHeight + 2);
setPositionChild(field, 85, 5);
// set the list name label field
field = getField(2);
layoutChild(field, preferredWidth, fontHeight + 2);
setPositionChild(field, 85, fontHeight + 6 + 5);
// set the due time name label field
field = getField(3);
layoutChild(field, preferredWidth, fontHeight + 2);
setPositionChild(field, 100, fontHeight + fontHeight + 8 + 5);
field = getField(4);
layoutChild(field, preferredWidth, fontHeight + 2);
setPositionChild(field, 100, fontHeight + fontHeight + fontHeight
+ 10 + 5);
setExtent(preferredWidth, getPreferredHeight());
}
// The preferred width of a row is defined by the list renderer.
public int getPreferredWidth() {
return Graphics.getScreenWidth();
}
// The preferred height of a row is the "row height" as defined in the
// enclosing list.
public int getPreferredHeight() {
return 179;// getRowHeight();
}
}
}
答案 0 :(得分:0)
我说labelfield从天生就有透明背景,可能并不完全正确。 当labelfield获得焦点时,有蓝色背景无法摆脱,甚至使用此演示代码:
一个简单且独立的helloworld示例。
final class HelloWorldScreen extends MainScreen{
EditField edt = null;
HelloWorldScreen() {
// set background to black
this.getMainManager().setBackground(BackgroundFactory.createSolidBackground(Color.BLACK));
// use to alternate focus
edt = new EditField("", "");
add(edt);
add(new LabelField("test label tranparent", DrawStyle.ELLIPSIS
| FOCUSABLE) {
public void paint(Graphics g) {}
public void applyTheme(){}
protected void paintBackground(Graphics g) { }
});
}
}
我重写paint()applyTheme()和paintBackground(),并在那里什么也不做。然而,聚焦的labelfield仍然具有蓝色背景。
是的,另一个WTF的事情。我建议您使用带有只读样式的editfiled吗?
答案 1 :(得分:0)
要解决聚焦的蓝色背景,您只需覆盖drawFocus并使其为空
protected void drawFocus(Graphics g, boolean on) {
}
这样就没有什么东西可以被吸引,因为这个领域至少是你想要的。