Blackberry 调用drawtext()时如何自定义换行?
这是一个列表字段Blackberry 调用drawtext()时如何自定义换行?,blackberry,newline,drawtext,Blackberry,Newline,Drawtext,这是一个列表字段 public class Custom_ListField extends ListField { private String[] title, category, date, imagepath; private int[] newsid, catsid; private List_News newslist; private Bitmap imagebitmap[], localimage = Bitmap .getBitmapResource("imag
public class Custom_ListField extends ListField {
private String[] title, category, date, imagepath;
private int[] newsid, catsid;
private List_News newslist;
private Bitmap imagebitmap[], localimage = Bitmap
.getBitmapResource("image_base.png");
private BrowserField webpage;
private Custom_BrowserFieldListener listener;
private boolean islatest;
private Vector content = null;
private ListCallback callback = null;
private int currentPosition = 0;
public Custom_ListField(Vector content, boolean islatest) {
this.content = content;
this.islatest = islatest;
newsid = new int[content.size()];
title = new String[content.size()];
category = new String[content.size()];
date = new String[content.size()];
imagepath = new String[content.size()];
catsid = new int[content.size()];
imagebitmap = new Bitmap[content.size()];
for (int i = 0; i < content.size(); i++) {
newslist = (List_News) content.elementAt(i);
newsid[i] = newslist.getID();
title[i] = newslist.getNtitle();
category[i] = newslist.getNewCatName();
date[i] = newslist.getNArticalD();
imagepath[i] = newslist.getImagePath();
if (!imagepath[i].toString().equals("no picture")) {
imagebitmap[i] = Util_ImageLoader.loadImage(imagepath[i]);
} else {
imagebitmap[i] = localimage;
}
catsid[i] = newslist.getCatID();
}
initCallbackListening();
this.setRowHeight(localimage.getHeight() + 10);
}
private void initCallbackListening() {
callback = new ListCallback();
this.setCallback(callback);
}
private class ListCallback implements ListFieldCallback {
public ListCallback() {
setBackground(Config_GlobalFunction
.loadbackground("background.png"));
}
public void drawListRow(ListField listField, Graphics graphics,
int index, int y, int width) {
currentPosition = index;
graphics.drawBitmap(
Display.getWidth() - imagebitmap[index].getWidth() - 5,
y + 3, imagebitmap[index].getWidth(),
imagebitmap[index].getHeight(), imagebitmap[index], 0, 0);
graphics.setColor(Color.WHITE);
graphics.drawRect(0, y, width, imagebitmap[index].getHeight() + 10);
graphics.setColor(Color.BLACK);
graphics.setFont(Font.getDefault().derive(Font.BOLD, 20));
graphics.drawText(title[index], 5, y + 3, 0, Display.getWidth()
- imagebitmap[index].getWidth() - 10);
graphics.setColor(Color.GRAY);
graphics.setFont(Font.getDefault().derive(Font.BOLD, 15));
graphics.drawText(date[index], 5, y + 6
+ Font.getDefault().getHeight() + 3);
if (islatest) {
graphics.setColor(Color.RED);
graphics.setFont(Font.getDefault().derive(Font.BOLD, 15));
graphics.drawText(category[index], Font.getDefault()
.getAdvance(date[index]) + 3, y + 6
+ Font.getDefault().getHeight() + 3);
}
}
public Object get(ListField listField, int index) {
return content.elementAt(index);
}
public int getPreferredWidth(ListField listField) {
return Display.getWidth();
}
public int indexOfList(ListField listField, String prefix, int start) {
return content.indexOf(prefix, start);
}
}
public int getCurrentPosition() {
return currentPosition;
}
protected boolean navigationClick(int status, int time) {
int index = getCurrentPosition();
if (catsid[index] == 9) {
if (Config_GlobalFunction.isConnected()) {
webpage = new BrowserField();
listener = new Custom_BrowserFieldListener();
webpage.addListener(listener);
MainScreen aboutus = new Menu_Aboutus();
aboutus.add(webpage);
Main.getUiApplication().pushScreen(aboutus);
webpage.requestContent("http://www.orientaldaily.com.my/index.php?option=com_k2&view=item&id="
+ newsid[index] + ":&Itemid=223");
} else
Config_GlobalFunction.Message(Config_GlobalFunction.nowifi, 1);
} else
Main.getUiApplication().pushScreen(
new Main_NewsDetail(newsid[index]));
return true;
}
}
这将仅绘制文本一行。我做了调查,发现没有内置的功能,必须自定义一个功能,使文本自动下一行
函数是这样的
private int numberoflines(int availablespace){
...
return numberlines
}
Rupak显示的链接很好,尽管其中一个引用了通用Java问题(并提出了需要为BlackBerry更改的Swing结果),而另一个引用了外部(非堆栈溢出)链接 如果您需要另一个选项,并且不希望算法计算出在哪里进行换行,您可以使用此选项。此代码假定您将“\n”字符放入字符串中,您希望将文本拆分为多行。您可能会将此代码放在
paint()
方法中:
//存储原始颜色,以便在结束时将其重置
int oldColor=graphics.getColor();
图形.设置颜色(颜色.黑色);
graphics.setFont(_fieldFont);
int endOfLine=_text.indexOf('\n');
if(内氟林<0){
graphics.drawText(_text,_padding,_top);
}否则{
//这是一个多行标签
int top=_top;
int指数=0;
int textLength=_text.length();
while(索引
在这里,您将初始化我在其中使用的一些变量。根据您发布的代码,我认为这些是正确的,但您需要再次检查:
String _text=title[index];//要绘制的文本
int _padding=5;//文本周围的左右侧填充
int _top=y+3;//文本顶部的y坐标
Font _fieldFont=Font.getDefault().derivate(Font.BOLD,20);
//为文本保留的总宽度,包括填充空间:
int _fieldWidth=Display.getWidth()-imagebitmap[index].getWidth();
检查此答案-。同时检查此项。它不起作用,文本仍与图像重叠。这是否支持utf-8文本?我的文字是中文。@AlanLai,我以为你的问题是你需要在多行上显示文字?上面的代码只是将包含“\n”字符的文本拆分为多行。它与绘制位图没有任何关系。如果文本与位图不正确重叠,则传递给drawText()
的x和y值肯定是错误的。在我的示例中,这些值是\u padding
和top
。看看这些,移动它们,直到它们在你的图像上。我不确定drawText()和UTF-8字符。但是,这和你在问题中使用的方法是一样的,我明白了。我想要的是一个函数,它将文本绘制成多行,并返回文本的高度texts@AlanLai,您希望高度为(1)像素总数,还是(2)线条数?如果需要总像素数,是希望行数乘以字体高度,还是希望结果包括行之间的垂直填充/间距?这就是我想要的。查看图像旁边的黑色文本。它是标题[索引]
private int numberoflines(int availablespace){
...
return numberlines
}