论坛首页 移动开发技术论坛

设计可组装的j2me UI(三) TextBox

浏览 5872 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-11-15  
     自己实现操作Canvas,很大部分是对文字的显示以及排版操作。而对字体的定义则每个厂商都有自己的规范,必然nokia定义了大,中,小字体。而我在其他手机上只有一种字体,所以无论你怎么样定义字体的大小都只有一种效果,这样的话。你可能要在程序中自己进行判断,然后在显示出来。要不然的话,则写出的程序在各个机型上显示的效果会有一些不同。
     下面让我们来设计可以滚动的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);
	}




以上代码是基本框架。思路就这样。实践起来也不困难。
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics