在本文中,我們將通過利用 MIDP的浮現自定義字體的功效來增加一些潤飾和對外觀的一些急需的把持。
首先我們討論對字體的內建支撐的上風和限制,並且斷定哪種利用程序可能需要自定義字體。然後先容一下實現您自己的字體的技巧,並將其准確地利用於終端模仿器 MIDlet中。
內置字體
應用 MIDP 的 Graphics
類,可以調用其 setFont()
來指定字體,然後調用該字體的一種 drawChar()
或 drawString()
方法來在 canvas 或後台圖像上浮現字體。MIDP僅供給了一套有限的字體選項,但是:字體可以是等寬的或成比例的,大小可以是小、中或大,並且樣式可以是平展或粗體、斜體和下劃線的任意組合。運行庫實現工具可能沒有滿足您的尺度的字體,它會將自由返回其斷定的最相近的字體。
大多數的利用程序都能允許這些限制。不管怎樣,利用程序開發職員都希看將其溶進主機平台的外觀和作風中。為使把持簡略,MIDP 2.0 供給了一個新的 getFont()
方法,供給一般地用於繪制靜態文本(如標題和標簽)的字體,以及用於繪制用戶在文本框中輸進的字符的字體。您可以確信這些字體存在,尺寸准確並與利用程序的其余部分一致。當調節給定字體的高度、寬度和基線,以及在運行時適當調劑用戶界面時,利用程序應能夠在不同種類的設備上准確地運行。
然而一些利用程序需要對它們的外觀進行更多的把持。例如,大多數游戲需要一種與其圖形其他部分的作風相一致的字體。一些平台可能存在特定的標題:當需要等寬字體時可能返回成比例字體,最小的字體可能太大了,並且一些字體可能不吸引人甚至無效。這些差別增大了創立和保護跨平台軟件的難度。
MIDTerm 就是這種情況。我們需要確保其字體等寬的、足夠小以便在屏幕上能繪制最多的行和列並且明白可讀,但在這一點上,繪制終端內容的 canvas取決於設備實現。假如給定字體過大終端將不可用,並且假如字體不是等寬的,利用程序基本就不能工作。在我們的項目標這一點上,MIDP模仿器返回的字體是等寬的且大小合適,但字體不是特別輕易浏覽。
實現自定義字體將供給所需的字體把持,以便加強對 MIDterm 可用性的信心。同樣重要的是,由於不再依附於每個平台的本地字體實現方法,其跨不同的 MIDP設備的性能將更具可預感性。
完成後,就會看到改良:
Before: Built-in FontAfter: Custom Font
創立自定義字體
字體有兩個起源:
Outline 字體:包含繪制每一個字符所需的指令。這些指令是准確的、冗長的且復雜的,但它們答應把持系統以任何尺寸和任何樣式來浮現字體。Bitmap 字體:僅通知把持系統對於每個字符哪些像素處於開狀態,哪些像素處於關狀態。它們是簡略明了,但對於所支撐的字體的每一種大小和樣式都需要一個獨立的指令集。移動設備有限的處理才能使其無法應用 outline 字體。這些設備自然要應用 bitmap字體,也正是我們將應用的。把持系統浮現我們的實現時不像內置字體那樣快,但為達到對字體外觀的盡對把持,這樣的時間就義能夠為人們所接收。
bitmap 字體的繪制指令是位到圖形環境中的地位的逐一映射。bitmap字體中的每一個字符對應於從內存拷貝到屏幕的像素排列。換一種說法,每一個字符是通過拷貝到屏幕的一個後台圖像來繪制的。從這個角度看,立即就能得到字體的定義(包含用於浮現字體的指令的文件)本身就可以是一個壓縮格局(如 PNG或 JPEG)的圖像文件。我們可以把這個圖像讀到內存中,然後在需要繪制我們的字體的字符時,將它的各有關部分拷貝到屏幕。
那麼第一步就是要創立一個這樣的圖像。在台式盤算機,應用您最愛好的圖像編纂器來創立一個新的文檔。該文檔的高度應當就是字體所需的高度,並且足夠寬來容納要浮現的字符集中的每一個字符。那是多寬呢?
Java 技巧通常采用 Unicode Character Standard。Unicode字符集有 95,000 多個字符,比我們能供給的要多,並遠遠超出我們的需要!因此 MIDTerm 的 Telnet 協議的實現方法是基於 7 位ASCII 字符集的基礎上,該字符集只包含 128 個字符。由於 MIDTerm 需要等寬字體,文檔寬度應為一個字符寬度的 128倍。例如,假如每一個字符高為 12 像素寬為 10 像素,為容納所有的 128 個字符,則需要高為 12 寬為 1,280 的圖像。
現在有了用於放置對應於 ASCII 代碼 0 到 127 的 128 個地位。為了能查明哪個字符放到哪個空位中,可能需要 ASCII 表 。請留心前 31 個字符是“把持字符”並且不能看到,可以保留為空缺。
可以一個像素一個像素地地手動把每一個字符填充到槽中,但應用盤算機中的某個字體的字符會更輕易一些。確保這個字體是您自己的或有應用允許。我應用的是一種稱為Anonymous 的字體,具有十分明白的 6-point 顯示且免費應用。您可以從 Mark Simonson StudiOS 下載。
應用 Anonymous,我的字體圖像看起來是這樣的:
從定義來講,由於一個位只有 on 和 off 兩種狀態,因此一個 bitmap 字體僅需要應用兩種色彩。可以應用一種色彩來定義狀態為“開”的像素,用另一種不同的色彩來定義所有其他。由於 MIDP2.0 設備需要支撐透明的圖像,應將圖像編纂器的“關”的色彩標記為透明。透明的像素是不可見的,答應任何像素通過盤算機中已有的利用程序 canvas 繪制。
您可能想把圖像文件存儲為 PNG 格局。一個單“位”的四周區域色彩一致的圖像正是這種圖像,這正是基礎 PNG壓縮算法所為之設計的。您的字體圖像文件將會壓縮得非常緊密:Anonymous 的 PNG 文件的大小只有 803 個字節大小。
自定義字體類
現在我們需要編寫一些軟件來讀取圖像文件並將其各部分浮現在屏幕上,我們將用到叫作 CustomFont
的一個新的類。
為了使 CustomFont
易於學習和應用,應盡可能地使其具有像尺度 MIDP Font
類一樣的外觀和作風。由於為了使實現者可應用原生代碼進行優化,Font
已經被聲明為 final
,因此不能為其定義子類,但我們能夠模仿其公共界面。Font
的每個方法在 CustomFont
中也有,並且只有靜態工廠方法 getFont()
具有不同的簽名,它采用文件名字來調換慣用的字體類型:
public static CustomFont getFont