设计可组装的j2me UI(三) TextBox UINokia框架
程序员文章站
2022-05-29 08:28:30
...
自己实现操作Canvas,很大部分是对文字的显示以及排版操作。而对字体的定义则每个厂商都有自己的规范,必然nokia定义了大,中,小字体。而我在其他手机上只有一种字体,所以无论你怎么样定义字体的大小都只有一种效果,这样的话。你可能要在程序中自己进行判断,然后在显示出来。要不然的话,则写出的程序在各个机型上显示的效果会有一些不同。
下面让我们来设计可以滚动的TextBox.
首先继承Part(UI的第一篇文章有给出代码)
以上代码是基本框架。思路就这样。实践起来也不困难。
下面让我们来设计可以滚动的TextBox.
首先继承Part(UI的第一篇文章有给出代码)
public class TextBox extends Part { /** 文本的行数 */ private int numOfEls; /** * 此页面最多显示得行数 */ private int maxNum; private int pillarHeight; /** 开始索引 * */ private int startIndex; /** * 文本的内容 */ private char [] textChars; /** * 文本切割后得内容 */ private String[] textNum; private String text; public void setString(String text) { this.text = text; this.textChars = text.toCharArray(); skipContent(); //numOfEls = textChars.length; } /** * 分割字符传.并处理pillar的高度,最主要的方法。 * 通过屏幕的高,宽,以及字体的体型进行文本出来。并把处理后的文本保存在一个Vector中,以后绘制出来就容易多了 * */ private void skipContent(){ this.numOfEls = FontUtil.siptRow(this.contentStyle.font, viewContent[WIDTH],text); int charWidth = viewContent[X]+ 2; int charHeight = viewContent[Y]; int h; if(numOfEls>this.maxNum){ h = (viewContent[WIDTH]-18); }else{ h = (viewContent[WIDTH]-12); } StringBuffer sb = new StringBuffer(); Vector ve = new Vector(); for(int i=0 ; i < this.textChars.length; i++){ sb.append(textChars[i]); charWidth = charWidth + contentStyle.font.charWidth(textChars[i]); if(charWidth>h){ charHeight = charHeight + contentStyle.font.getHeight() ; charWidth = viewContent[X] + 2; ve.addElement(sb.toString()); log.debug(sb); sb = null; sb = new StringBuffer(); } } ve.addElement(sb.toString()); log.debug(sb); textNum = new String[ve.size()]; ve.copyInto(this.textNum); ve.removeAllElements(); ve = null; //获取最大的数组值 maxNum = viewContent[HEIGHT]/(this.contentStyle.font.getHeight() ) ; this.numOfEls = this.textNum.length; this.pillarHeight = numOfEls > maxNum ? viewContent[HEIGHT]/(numOfEls-maxNum +1):0; log.debug("MaxNum=" + maxNum); log.debug("numOfEls=" + numOfEls); } /** * 绘制文本的内容,自动实现,状态条的显示等 * @param g */ private void paintContent(Graphics g) { this.contentStyle.setFontColor(g); int charWidth = viewContent[X]+ 2; int charHeight = viewContent[Y]; int size = maxNum > this.numOfEls? numOfEls:maxNum; log.debug(startIndex); for(int i=startIndex ; i < size + startIndex; i++){ g.drawString(this.textNum[i],charWidth,charHeight,Graphics.TOP | Graphics.LEFT); charHeight = charHeight + contentStyle.font.getHeight() ; } paintPillar(viewContent[WIDTH]-pillarWidth-4, viewContent[Y],g); } private void paintPillar(int x,int y,Graphics g){ if (maxNum > this.numOfEls) return; pillar.paint(x,y+(startIndex * pillarHeight),viewContent[WIDTH],this.pillarHeight,g); }
以上代码是基本框架。思路就这样。实践起来也不困难。