原文地址: J2ME下实现绘制居中文字

本函数主要功能为绘制左右居中,居左或居右的文字

在新版本的MIDP中,有的设备厂商,像诺基亚,已经不支持HCENTER和VCENTER

所以今天来实现一把

具体效果如下:



下面来看代码:

Code:

 public static final int LEFT 1//居左
public static final int CENTER << 1//居中
public static final int RIGHT << 2//居右
public static final int TOP << 3//居上
public static final int MIDDLE << 4//居中
public static final int BOTTOM << 5//居下
 
public static final int FONT_HEIGHT 11//字体高度
 
/**
 * 绘制居中字符串
 * @param g Graphics - 画刷
 * @param str String - 绘制字符串
 * @param rectX int - 矩形左上角X
 * @param rectY int - 矩形左上角Y
 * @param rectWidth int - 矩形宽度
 * @param rectHeight int - 矩形高度
 * @param align int - 类型
 * @return boolean - 是否成功
 */
public static boolean drawAlignStr(
                                
Graphics gString str,
                                
int rectXint rectY,
                                
int rectWidthint rectHeight,
                                
int align) {
        if (
str == null || == null) {
                return 
false;
        }
        
        
//获得字体
        
Font currentFont g.getFont();
        
        
//绘制坐标
        
int x 0;
        
int y 0;
        
        
//字符串宽度与高度
        
int strWidth currentFont.stringWidth(str);
        
int strHeight FONT_HEIGHT//currentFont.getHeight() 不能使用
        
        //矩形右边和下边坐标
        
int rectRight rectX rectWidth;
        
int rectBottom rectY rectHeight:
        
        if ((
align CENTER) == CENTER) {
                
= (rectWidth >> 1) - (strWidth >> 1) + rectX;
        } else if ((
align LEFT) == LEFT) {
                
rectX;
        } else if ((
align RIGHT) == RIGHT) {
                
rectWidth strWidth rectX;
        }
        
        
//如果字符串宽度超出Rect,居左显示(错误处理也可以写在这) return false;
        
rectX rectX x;
        
rectRight rectX x;
 
        if ((
align MIDDLE) == MIDDLE) {
                
= (rectHeight >> 1) - (strHeight >> 1) + rectY;
        } else if ((
align TOP) == TOP) {
                
rectY;
        } else if ((
align BOTTOM) == BOTTOM) {
                
rectHeight strHeight rectY;
        }
        
        
//如果字符串高度超出Rect,居上显示(错误处理也可以写在这) return false;
        
rectY rectY y;
        
rectBottom rectY y;
        
        
//裁减区
        
int oldClipX g.getClipX();
        
int oldClipY g.getClipY();
        
int oldClipWidth g.getClipWidth();
        
int oldClipHeight g.getClipHeight();
 
        
g.setClip(rectXrectYrectWidthrectHeight);
 
        
//绘制
        
g.drawString(strxyGraphics.LEFT Graphics.TOP);
        
        
g.setClip(oldClipXoldClipYoldClipWidtholdClipHeight);     
        
        return 
true;
}





说明:


  1. 主要起功能的函数是 currentFont.stringWidth(str) 获取字符宽度
  2. 经过测试,currentFont.getHeight() 函数不能获得真实的字符高度,比如在手机顽童上getHeight()是14,但是真实的11像素,诺基亚S60模拟器也是这样的,WTK暂时未测,但是真实显示情况与手机顽童相符
  3. 本函数使用的错误判断,还不够健壮,只是简单的判断,输出居左或居上文字,如果return false,将会更好
  4. 根据上面那个函数也可以输出支持居中锚点的实现,就请读者自己实现吧,读者也可以进一步封装,形成其他用途的函数