JavaMe開發(fā):低級(jí)界面繪圖之點(diǎn)陣字
【問題描述】JavaMe自帶的字體只有三種:Font.SIZE_SMALL、Font.SIZE_MEDIA和Font.SIZE_LARGE,所謂的Font.SIZE_LARGE其實(shí)也不是很大。如果要繪制其他字號(hào)的字體該怎么辦呢?運(yùn)用低級(jí)界面Canvas繪制的點(diǎn)陣字是一個(gè)不錯(cuò)的選擇。
【字模工具】
曉奇工作室
取模方式:從左到右從上到下,橫向8點(diǎn)左高位
【分析】
所謂“點(diǎn)陣字”就是文字是由點(diǎn)陣構(gòu)成的。點(diǎn)陣字有兩個(gè)基本屬性,那就是寬(width)和高(height)。先看一個(gè)例子:
如圖1所示,Asc5x8表示寬度為5,高度為8的點(diǎn)陣字集。一個(gè)char型的字符能表示8位。取模工具實(shí)際上是用二進(jìn)制“1”,表示點(diǎn)陣的文字。用二進(jìn)制的“0”,表示非文字的空白塊。以Asc5x8的“!”為例進(jìn)行講解:
0x20,0x20,0x20,0x20,0x20,0x00,0x20,0x00, // -!-
對(duì)應(yīng)的點(diǎn)陣為:
00100000
00100000
00100000
00100000
00100000
00000000
00100000
00000000
注意到,如果將“1”替換為像素點(diǎn)顯示,而“0”替換為空白塊。則剛好顯示為一個(gè)“!”號(hào)。寬度為5,所以用一個(gè)字節(jié)表示就可以了。如果寬度超過一個(gè)字節(jié),那么如何計(jì)算需要多少個(gè)字節(jié)才能表示寬度呢?原則是,寬度的表示必須為字節(jié)的倍數(shù)。如寬度為9,那么超過一個(gè)字節(jié),所以用2個(gè)字節(jié)表示。
總結(jié)寬度所需字節(jié)計(jì)算公式如下:
n = (width-1)/8+1
Asc5x8中width即為5.
那么高度如何計(jì)算呢?高度其實(shí)不用進(jìn)行計(jì)算,由取模軟件完成了。
明白上述原理后,就很簡(jiǎn)單了。且看代碼。
【代碼清單】
- package com.token.view.components;
- import javax.microedition.lcdui.Graphics;
- import javax.microedition.lcdui.game.GameCanvas;
- public class CustomFont {
- public final char font24x48[][] = // ASCII
- {
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // - -
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- },
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -!-
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,
- 0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x78,
- 0x00,0x00,0x78,0x00,0x00,0x78,0x00,0x00,
- 0x78,0x00,0x00,0x78,0x00,0x00,0x78,0x00,
- 0x00,0x78,0x00,0x00,0x78,0x00,0x00,0x30,
- 0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,
- 0x30,0x00,0x00,0x30,0x00,0x00,0x30,0x00,
- 0x00,0x30,0x00,0x00,0x30,0x00,0x00,0x30,
- 0x00,0x00,0x30,0x00,0x00,0x30,0x00,0x00,
- 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x70,0x00,0x00,0xF8,0x00,0x00,
- 0xF8,0x00,0x00,0xF8,0x00,0x00,0x70,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- },
- {
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, // -"-
- 0x00,0x00,0xC0,0xC0,0x01,0xE1,0xE0,0x03,
- 0xE3,0xE0,0x03,0xC3,0xC0,0x07,0x87,0x80,
- 0x07,0x07,0x00,0x0E,0x0E,0x00,0x0C,0x0C,
- 0x00,0x18,0x18,0x00,0x10,0x10,0x00,0x20,
- 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- },
- ...
- {
- 0x07,0x80,0x00,0x1F,0xC0,0x00,0x10,0xE0, // --
- 0x04,0x20,0x70,0x04,0x20,0x38,0x08,0x40,
- 0x1C,0x08,0x40,0x0F,0x10,0x00,0x07,0xF0,
- 0x00,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
- }
- };
- public CustomFont()
- {
- }
- public void drawmat(GameCanvas canvas, Graphics g, char mat[], int w, int h, int x, int y, int color)
- {
- int i,j,k,n;
- n = (w-1)/8+1;
- for(j=0; j<h; j++)
- {
- for(i=0; i<n; i++)
- {
- for(k=0; k<8; k++)
- {
- if (!((mat[j * n + i] & (0x80 >> k)) == 0)) /* 測(cè)試為1的位則顯示 */
- {
- g.setColor(color);
- g.drawLine(x + i * 8 + k, y + j, x + i * 8 + k, y + j);
- }
- }
- }
- }
- }
- }
n就是表示整個(gè)寬度需要的字節(jié)數(shù),由于寬度為24,故需要3個(gè)字節(jié)表示。j記錄縱向(高度)位置。代碼的處理,就是通過一個(gè)畫線函數(shù)進(jìn)行的。每次以字節(jié)為單位(變量k處理),對(duì)“1”進(jìn)行檢測(cè),檢測(cè)到1后,記錄k的位置。
【調(diào)用方法】
CustomFont主要用于GameCanvas派生的類。在繼承GameCanvas的類中:
(1)聲明對(duì)象
- private CustomFont cf;
(2) 初始化對(duì)象(在構(gòu)造函數(shù)中)
- cf = new CustomFont();
(3) 調(diào)用方法(畫字符串passwd)
- for(int i=0; i<passwd.length(); i++)
- {
- cf.drawmat(this, graphics, cf.font24x48[passwd.charAt(i)-' '], 24, 48, (width-6*24)/2+i*24, (height-48)/3, Color.WHITE);
- }
【效果】
圖2中,框中的文字就是通過繪制得到的。
【設(shè)計(jì)參考】
(1) http://aiquantong.iteye.com/blog/1457906
(2) http://blog.csdn.net/alleniversoncomputer/article/details/7016368
原文鏈接:http://blog.csdn.net/tandesir/article/details/7506065
【系列文章】