|
在MIDP中,我们可以利用高层API在手机屏幕上输出文本,而且我们可以在输出的文本中插入转义字符'\n'来解决文本输出中的自动换行问题。但是,一般来说对于手机屏幕上的文本我们都是利用底层API绘制上去的。这样的话,就会引发一个文本在屏幕上如何换行的问题。 其实,我们可以利用字符宽度与屏幕宽度,来解决这个问题。即,把若干个字符的宽度相加,一直加到等于屏幕宽度后再绘制这些字符。绘制完毕后,移动到下一次要绘制的位置,继续重复上述工作。直到所有的字符绘制完毕。我们可以通过Font类的charWidth()获取字符的宽度。通过Canvas类的getWidth()获取设备屏幕的宽度。 请参看如下代码: import javax.microedition.lcdui.*; public class WordCanvas extends Canvas{
/* * 要绘制的字符串 */ String str="abcdefghijklmnopqr\nstuvwxyz12345678901234\n5678901234567890123456789012\n34567890123456789012345678901234567890a"; public void newline(Graphics g,Font font){ /* * 表征字符串的索引,通过index获取字符串中的每一个字符 */ int index=0; /* * 若干个字符的宽度的总和 */ int charsWidth=0; /* * 绘制每一行字符串时,锚点的列坐标 */ int row=0; char ch; /* * buf用来临时存储屏幕上的一行字符串,即buf中存储的每个字符的宽度之和等于屏幕宽度时 * 就把buf中的字符串绘制到屏幕上,同时清空buf,以便重新存储下一行字符。 */ StringBuffer buf=new StringBuffer(); /* * 通过循环遍历字符串中的每一个字符 */ while(index<str.length()){ ch=str.charAt(index++);//获取一个字符 if(ch=='\n'){//如果文本中有换行符,则立即换行。 //把buf中的字符绘制到屏幕上 g.drawString(buf.toString(),0,row,Graphics.TOP|Graphics.LEFT); buf.delete(0,buf.length());//清空buf charsWidth=0;//字符宽度和清0 row+=font.getHeight();//通过getHeight()确定下一行的绘制位置 }else{//如果没有遇到换行符的话,把新字符的宽度进行累加 charsWidth+=font.charWidth(ch);
if(charsWidth<=this.getWidth()){//如果字符宽度和小于屏幕宽度,则把字符添加到buf中 buf.append(ch); }else{//如果字符宽度和大于屏幕宽度,则要绘制buf中的字符,并清空buf。 g.drawString(buf.toString(),0,row,Graphics.TOP|Graphics.LEFT); buf.delete(0,buf.length()); //绘制完毕后,把刚刚获取的字符,添加到buf中,同时重置字符宽度和,定位下一行的绘制位置。 buf.append(ch); charsWidth=font.charWidth(ch); row+=font.getHeight(); } } }
//当循环结束后,在buf中会遗留一些字符没有绘制。这是因为在循环中只有当遇到换行符或字符排满一行时,才 //进行绘制工作,可是往往在读到字符串尾部时,会遗留一些字符,它们恰恰不能凑满一行。所以循环结束后,还 //要一次绘制工作。 g.drawString(buf.toString(),0,row,Graphics.TOP|Graphics.LEFT); } public void paint(Graphics g){
newline(g,Font.getDefaultFont()); } }
|