1.点阵字库
点阵字库是把每一个汉字都分成16×16或24×24个点,然后用每个点的虚实来表示汉字的轮廓,常用来作为显示字库使用,这类点阵字库汉字最大的缺点是不能放大,一旦放大后就会发现文字边缘的锯齿。
矢量字库保存的是对每一个汉字的描述信息,比如一个笔划的起始、终止坐标,半径、弧度等等。在显示、打印这一类字库时,要经过一系列的数学运算才能输出结果,但是这一类字库保存的汉字理论上可以被无限地放大,笔划轮廓仍然能保持圆滑,打印时使用的字库均为此类字库.
2.点阵字库结构
在汉字的点阵字库中,每个字节的每个位都代表一个汉字的一个点,每个汉字都是由一个矩形的点阵组成,0代表没有,1代表有点,将0和1分别用不同颜色画出,就形成了一个汉字,常用的点阵矩阵有12*12, 14*14, 16*16三种字库。 字库根据字节所表示点的不同有分为横向矩阵和纵向矩阵,目前多数的字库都是横向矩阵的存储方式(用得最多的应该是早期UCDOS字库),纵向矩阵一般是因为有某些液晶是采用纵向扫描显示法,为了提高显示速度,于是便把字库矩阵做成纵向,省得在显示时还要做矩阵转换。我们接下去所描述的都是指横向矩阵字库。
对于16*16的矩阵来说,它所需要的位数共是16*16=256个位,每个字节为8位,因此,每个汉字都需要用256/8=32个字节来表示。 即每两个字节代表一行的16个点,共需要16行,显示汉字时,只需一次性读取32个字节,并将每两个字节为一行打印出来,即可形成一个汉字.
16*16:
public class Font16 {
private Context context;
public Font16(Context context) {
this.context = context;
}
private final static String ENCODE = "GB2312";
private final static String ZK16 = "HZK16";
private boolean[][] arr;
int all_16_32 = 16;
int all_2_4 = 2;
int all_32_128 = 32;
public boolean[][] drawString(String str) {
byte[] data = null;
int[] code = null;
int byteCount;
int lCount;
arr = new boolean[all_16_32][all_16_32];
for (int i = 0; i < str.length(); i++) {
if (str.charAt(i) < 0x80) {
continue;
}
code = getByteCode(str.substring(i, i + 1));
data = read(code[0], code[1]);
byteCount = 0;
for (int line = 0; line < all_16_32; line++) {
lCount = 0;
for (int k = 0; k < all_2_4; k++) {
for (int j = 0; j < 8; j++) {
if (((data[byteCount] >> (7 - j)) & 0x1) == 1) {
arr[line][lCount] = true;
System.out.print("@");
} else {
System.out.print(" ");
arr[line][lCount] = false;
}
lCount++;
}
byteCount++;
}
System.out.println();
}
}
return arr;
}
protected byte[] read(int areaCode, int posCode) {
byte[] data = null;
try {
int area = areaCode - 0xa0;
int pos = posCode - 0xa0;
InputStream in = context.getResources().getAssets().open(ZK16);
long offset = all_32_128 * ((area - 1) * 94 + pos - 1);
in.skip(offset);
data = new byte[all_32_128];
in.read(data, 0, all_32_128);
in.close();
} catch (Exception ex) {
}
return data;
}
protected int[] getByteCode(String str) {
int[] byteCode = new int[2];
try {
byte[] data = str.getBytes(ENCODE);
byteCode[0] = data[0] < 0 ? 256 + data[0] : data[0];
byteCode[1] = data[1] < 0 ? 256 + data[1] : data[1];
} catch (Exception ex) {
ex.printStackTrace();
}
return byteCode;
}
}
自定义SurfaceView:
public class MySurfaceView extends SurfaceView {
private Context mContext;
private SurfaceHolder holder;
public MySurfaceView(Context context) {
super(context);
// TODO Auto-generated constructor stub
this.mContext = context;
holder = this.getHolder();
}
public MySurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
this.mContext = context;
holder = this.getHolder();
}
public MySurfaceView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
// TODO Auto-generated constructor stub
this.mContext = context;
holder = this.getHolder();
}
/**
* show font
*
* @param font_kind
* the font type, has 16,24,32
* @param font
* draw font
* @param startx
* the font coordinate start x value
* @param starty
* the font coordinate start y value
* @param beishu
* the font magnification multiple
* @param type
* draw font use icon,1 is flower,2 is love
*/
public void show_font16(int font_kind, String font, int startx, int starty, int beishu, int type) {
boolean[][] arr = null;
int weith = 16;
int height = 16;
if (font_kind == 16) {
weith = 16;
height = 16;
arr = new boolean[weith][height];
Font16 font16 = new Font16(mContext);
arr = font16.drawString(font);
} else if (font_kind == 24) {
weith = 24;
height = 24;
arr = new boolean[weith][height];
Font24 font24 = new Font24(mContext);
arr = font24.drawString(font);
} else {
weith = 32;
height = 32;
arr = new boolean[weith][height];
Font32 font32 = new Font32(mContext);
arr = font32.drawString(font);
}
for (int i = 0; i < weith; i++) {
for (int j = 0; j < height; j++) {
try {
Thread.sleep(25);
} catch (InterruptedException e1) {
// TODO 自动生成的 catch 块
e1.printStackTrace();
}
float x = (float) j;
float y = (float) i;
if (arr[i][j]) {
Bitmap bitmap = null;
if (type == 1) {
bitmap = BitmapFactory.decodeStream(mContext.getResources().openRawResource(R.drawable.hua));
} else if (type == 2) {
bitmap = BitmapFactory.decodeStream(mContext.getResources().openRawResource(R.drawable.love));
}
int bw = bitmap.getWidth();
int bh = bitmap.getHeight();
synchronized (holder) {
Canvas c = null;
try {
c = holder.lockCanvas(new Rect(startx + (int) x * beishu, starty + (int) y * beishu, startx + (int) x * beishu
+ bw, starty + (int) y * beishu + bh));
Paint p = new Paint();
p.setColor(Color.RED);
c.drawBitmap(bitmap, startx + x * beishu, starty + y * beishu, p);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (c != null) {
holder.unlockCanvasAndPost(c);// 结束锁定画图,并提交改变。
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
}
}
}