请问在Canvas里能用drawString添加多行文字吗?

wangloveyang 2009-03-02 10:16:14
请问在Canvas里能用drawString添加多行文字吗?
...全文
658 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuyan87101 2009-05-10
  • 打赏
  • 举报
回复
一楼的感觉就可以啊,呵呵
吐泡泡的鱼 2009-05-10
  • 打赏
  • 举报
回复
逐个字符drawChar可能会比较慢,预先按照需要把字符串切割成目标字符串数组,直接逐行绘制出来.


/**
* 将某个字符串切割成适合显示长度的数组
* @param font 显示字体
* @param strSrc 待切割的文字
* @param width 每行的最大宽度
* @return 处理后的结果字符串数组
*/
public static String[] Str_Split(Font font, String strSrc, int width) {
int totalWidth = font.stringWidth(strSrc);
int totalLines = totalWidth / width;
if (totalWidth % width != 0) {
totalLines++;
}
String lines[] = new String[totalLines];
int lineIndex = 0;
int startIndex = 0;
int length = strSrc.length();
int lineWidth = 0;
int charWidth = 0;
for (int i = 0; i < length; i++) {
charWidth = font.charWidth(strSrc.charAt(i));
if (lineWidth + charWidth > width || i == length - 1) {
lines[lineIndex++] = strSrc.substring(startIndex, i);
startIndex = i;
lineWidth = 0;
}
lineWidth += charWidth;
}
return lines;
}
steven123oscar 2009-05-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 Mailbomb 的回复:]
drawString只能绘制一行文件
如果想绘制多行,则需要自己实现折行以及每行坐标的计算的逻辑,然后循环调用该方法进行绘制。
[/Quote]

up
hc0120 2009-05-07
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yangc_83 的回复:]
1楼的不行吗?应该可以的,原理是一样的
把他的g.drawChar(c, x, y, 20);
改成g.drawString(""+c, x, y, 20);看看
[/Quote]

支持。
网络咖啡 2009-05-06
  • 打赏
  • 举报
回复
drawString只能绘制一行文件
如果想绘制多行,则需要自己实现折行以及每行坐标的计算的逻辑,然后循环调用该方法进行绘制。
yangc_83 2009-05-06
  • 打赏
  • 举报
回复
1楼的不行吗?应该可以的,原理是一样的
把他的g.drawChar(c, x, y, 20);
改成g.drawString(""+c, x, y, 20);看看
余易键1303 2009-05-05
  • 打赏
  • 举报
回复
学习学习
prince58 2009-03-06
  • 打赏
  • 举报
回复
在Canvas想画一段文字(有几行)的话得先根据给定的文档框的宽,确定这些文字要画几行(要计算每一个字的宽度,然后加起来,超过文本框的宽就换行)。然后再用DrawString一行一行画出来。

这样的代码网上还是能找得到,最好自己写一个吧。
cccloveyf 2009-03-06
  • 打赏
  • 举报
回复
我的思路
写个方法,传入一个String,和一个宽度,然后return一个按宽度截取的String[]数组。
然后在用如下方法绘制多行。

g.setFont(Font.getDefaultFont());
int x = ?;
int y = ?;
String[] lines = funname???("你要按宽度拆分的长字符串", 50);
for (int i = 0; i < lines.length; i++) {
g.drawString(lines[i], x, y, Graphics.TOP | Graphics.LEFT);
y += Font.getDefaultFont().getHeight();
}
xpjsky 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zmjsg 的回复:]
以下纯属个人意见:
如果要绘制多行文字,定义一个StringBuffer 把要绘制的文字用append方法+入,然后再用g.drawString(stringbuffer.toString(),x,y,0);方法绘制..
[/Quote]此方法不可行,因为不管是什么手机哪怕全都是nokia品牌的手机,都会出现相同代码,不同字体大小的问题。所以每次绘制都需要得到文字的宽度,然后按照屏幕大小进行判断绘制,否则,一个StringBuffer过长(超过屏幕大小就属于过长了),会导致绘制在屏幕外面,那么,就只能显示部分文字了。

举个例子,WTK的字体和NOKIA SDK的字体就属于不同类型,不同字体大小的。WTK普遍偏小一点。

所以,借鉴亚日的代码有价值,如果效率有点问题,可以采用更加简单一点的方法,把那段代码的繁琐部分自己简化一下,其实并不复杂。
网络咖啡 2009-03-03
  • 打赏
  • 举报
回复
可以啊,上下坐标错开即可
kf156 2009-03-02
  • 打赏
  • 举报
回复
得自己实现哦

发一个我目前在用的,效率上可能有点问题,不过感觉蛮好用的。
不知道哪位牛人写的,顺便在此感谢下

/**
* 可换行绘制文本
*
* @param g
* Graphics
* @param str
* 文本内容
* @param x
* 左边距X
* @param y
* Y
* @param rightMargin
* 右边距
* @param font
* 字体
*
* @return row 行数
*/
public static int drawWrapString(Graphics g, String str, int x, int y,
int rightMargin, Font font) {
int row = 0;// 记录行数
int leftMargin = x;// 左边距
int fW = 0;// 单个字符的宽
int fH = font.getHeight();// 文字的高度
char c;
for (int i = 0; i < str.length(); i++) {
c = str.charAt(i);
fW = font.charWidth(c);

if (c == '\n' || (x + fW) > rightMargin) {
x = leftMargin; // 改变x坐标
y += fH + 2; // 换行
row++;
}
g.drawChar(c, x, y, 20);
x += fW; // 使X坐标变大

}
return row;
}


startym 2009-03-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 zmjsg 的回复:]
以下纯属个人意见:
如果要绘制多行文字,定义一个StringBuffer 把要绘制的文字用append方法+入,然后再用g.drawString(stringbuffer.toString(),x,y,0);方法绘制..
[/Quote]
是个好办法,回去试试!
zmjsg 2009-03-02
  • 打赏
  • 举报
回复
以下纯属个人意见:
如果要绘制多行文字,定义一个StringBuffer 把要绘制的文字用append方法+入,然后再用g.drawString(stringbuffer.toString(),x,y,0);方法绘制..
史前文物 2009-03-02
  • 打赏
  • 举报
回复
1楼的代码有可能拆分一个完整的单词!

比如:

例子例子例子例子wo
rk例子例子例子例子

13,100

社区成员

发帖
与我相关
我的任务
社区描述
Java J2ME
社区管理员
  • J2ME社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧