原创作者: wuhua   阅读:1602次   评论:2条   更新时间:2011-05-26    
     自己实现操作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);
	}




以上代码是基本框架。思路就这样。实践起来也不困难。
评论 共 2 条 请登录后发表评论
2 楼 yangvb 2010-07-26 11:13
引用

    [*]
[size=x-small][/size]
1 楼 yangvb 2010-07-26 11:13
[b][/b][i][/i][u][/u]
引用

    [*]
[img][/img][url][/url][flash=200,200][/flash]
[flash=200,200][[color=red][/color][size=small][/size]/flash]

发表评论

您还没有登录,请您登录后再发表评论

文章信息

  • wuhua在2006-11-15创建
  • wuhua在2011-05-26更新
Global site tag (gtag.js) - Google Analytics