曹郁輝
(十堰職業(yè)技術(shù)學(xué)院黨委工作部,湖北十堰442000)
J2ME(JAVA 2 Micro Edition)是為手機(jī)等消費(fèi)類電子產(chǎn)品開發(fā)程序的JAVA語言平臺,用它開發(fā)的程序可以不受設(shè)備的操作系統(tǒng)類型的限制。無論是Symbian、Microsoft windows、Android、Linux操作系統(tǒng)的智能手機(jī)還是不帶操作系統(tǒng)的非智能手機(jī),大都支持J2ME開發(fā)的程序的運(yùn)行。因此J2ME開發(fā)的程序有很強(qiáng)的適應(yīng)性和較長的生命力[1]。然而,近些年來,手機(jī)硬件的發(fā)展日新月異,無論是從手機(jī)CPU的速度、內(nèi)存的大小、各種傳感器的應(yīng)用和新型顯示技術(shù)的應(yīng)用都有非常大的發(fā)展。而很多J2ME開發(fā)的程序沒有考慮到這些發(fā)展變化而影響了這些程序的廣泛應(yīng)用。例如隨著手機(jī)顯示屏尺寸逐漸增大,分辨率逐漸增加,很多采用J2ME編寫的軟件由于采用固定分辨率,造成在較新型號手機(jī)上使用不便,甚至無法使用,大大縮短了軟件的生命力。本文將討論J2ME軟件編程時適應(yīng)各種手機(jī)顯示屏分辨率的問題。
所謂J2ME程序手機(jī)屏幕分辨率是指無論在何種手機(jī)顯示屏的分辨率下,程序都能自動調(diào)整,按照最適合當(dāng)前分辨率的模式來顯示程序運(yùn)行的人機(jī)界面。市場上現(xiàn)有的手機(jī),顯示分辨率從相對低端的176×144像素到高端的iphone手機(jī)的960×640像素,相差是比較大的,而且還不斷有顯示屏尺寸更大、分辨率更高的手機(jī)推出,比如在本文寫作過程中,已經(jīng)有了分辨率為1280×720的手機(jī)。如果你希望自己編寫的程序在這些機(jī)器中都能很好地運(yùn)行,那么在編程的時候就應(yīng)該考慮到,程序當(dāng)中的界面,都能夠適應(yīng)各種不同的手機(jī)顯示屏的分辨率。
要實(shí)現(xiàn)這種分辨率自適應(yīng),在使用J2ME編程的時候要考慮這樣幾點(diǎn):(1)手機(jī)屏幕上顯示的文字。(2)在程序當(dāng)中,利用JAVA函數(shù)繪制的圖形。(3)程序當(dāng)中使用的外部圖像文件。其中程序當(dāng)中使用外部圖像文件是最復(fù)雜,也是我們要重點(diǎn)考慮的。
手機(jī)屏幕上顯示的文字在使用J2ME編程時是可以通過字號的設(shè)置控制其大小的。同時,同一個字號的文字會隨著手機(jī)屏幕尺寸的增大顯示得大一些。因此,文字在不同分辨率下顯示時,矛盾并不突出。
在手機(jī)屏幕上顯示的一些簡單圖形,如點(diǎn)、線、圓、矩形等,使用J2ME編程時可以利用現(xiàn)成的JAVA函數(shù)來進(jìn)行繪制。繪制時,首先要規(guī)劃好顯示屏上顯示的所有圖形,它們相對于顯示屏的大小以及圖形間的相對位置。按照顯示屏的比例來繪制圖形,無論顯示屏的分辨率如何改變,顯示的圖形也會隨之而改變,能比較好地顯示出來不變形。
由于利用JAVA函數(shù)繪制的圖形有相當(dāng)?shù)木窒扌?只能畫簡單圖形,不能勝任畫面比較復(fù)雜的情況,所以很多時候我們不得不使用外部的圖像文件。J2ME程序當(dāng)中使用的外部圖像文件都是點(diǎn)陣圖像文件,它的特點(diǎn)是像素的數(shù)目是固定的,如果屏幕的分辨率發(fā)生變化,圖像本身是不變的。對于這種圖像,要想使之適應(yīng)屏幕分辨率的變化,我們要根據(jù)屏幕分辨率的大小對圖像進(jìn)行適當(dāng)?shù)目s放。JAVA里沒有圖像縮放函數(shù),要靠用戶自己編寫。
1.利用JAVA函數(shù)繪制簡單圖形
下面是一個繪制屏幕上菜單選項(xiàng)的程序,菜單由簡單的矩形構(gòu)成:
LABELS.length為菜單項(xiàng)的數(shù)目,prefer-Width和preferHeight根據(jù)字體大小由另一個函數(shù)得出??梢钥闯?程序中所繪制的圖形大小不是絕對值,會隨著屏幕的大小變化而變化,能夠適應(yīng)不同手機(jī)顯示屏的分辨率。
2.使用外部圖像文件
在使用外部圖像文件時,設(shè)計(jì)一個好的縮放函數(shù)很重要。下面給出一個圖像縮放函數(shù)的例子:
函數(shù)說明:輸入?yún)?shù)src為原始圖像,destW為目標(biāo)圖像的寬,dest H為目標(biāo)圖像的高。在給出了原始圖像后,該函數(shù)按照逐點(diǎn)繪制的方式,按指定的寬和高生成新圖像。該函數(shù)在每次加載圖像后使用,按照重新計(jì)算所得的destW和dest H來完成圖像的縮放。該函數(shù)的優(yōu)點(diǎn)是:可以保持原圖像的透明度信息;缺點(diǎn)是:沒有插值運(yùn)算,放大后會產(chǎn)生比較明顯的失真。
使用外部圖像在程序設(shè)計(jì)時還要首先設(shè)定一個基準(zhǔn)的分辨率,也就是該程序當(dāng)中的圖像最適合顯示的分辨率是多少。比如一個程序當(dāng)中的所有圖像最初設(shè)計(jì)時是為了在240×320的分辨率下顯示的,那么在屏幕分辨率為176×144的手機(jī)上顯示就應(yīng)該縮小,在屏幕分辨率為320×480的手機(jī)上顯示就應(yīng)該放大,這樣就適應(yīng)了屏幕的變化。這個基準(zhǔn)分辨率是程序設(shè)計(jì)人員在編程時根據(jù)需要來進(jìn)行選擇的,這個程序主要用在哪個分辨率的機(jī)型上,就可以選擇哪個分辨率。如果沒有特定對象,可以選擇用戶使用最普遍的顯示屏的分辨率。
在對圖像進(jìn)行縮放時要注意,在J2ME使用的圖像中,有些是作為平鋪貼圖使用的。所謂平鋪貼圖,是為了實(shí)現(xiàn)特定的紋理,將一張大圖分割成一塊塊大小相同的小圖像,小圖像在使用時可以任意拼接。J2ME定義,作為平鋪貼圖的大圖像的寬必須是小圖像寬的整數(shù)倍,如果不是的話,在設(shè)定貼圖時就會出錯。在基準(zhǔn)分辨率下滿足條件的平鋪貼圖,如果經(jīng)過縮小操作,由于小數(shù)部分舍入的原因,可能會出現(xiàn)問題。比如我們在編程時選擇的基準(zhǔn)分辨率是320×480,用于平鋪貼圖的大圖的寬是300像素,小圖的寬是50像素,如果當(dāng)前手機(jī)顯示屏的分辨率是240×320,那么平鋪貼圖就要進(jìn)行縮小操作。如果直接按比例進(jìn)行縮小,所得的平鋪貼圖大圖寬(即destW)為225像素,小圖寬38像素,大圖寬不是小圖寬的整數(shù)倍,顯而易見,設(shè)定貼圖時就會出錯。為避免這種情況的發(fā)生,程序當(dāng)中要有容錯語句,可以先算出縮小后的小圖的寬度,再用倍數(shù)去乘,得到大圖的寬度。在縮放函數(shù)中使用這樣倒推后得到的平鋪貼圖縮小后的寬度(即destW),就不會出錯了。在這個例子中,我們算得小圖的寬為38像素,大圖的寬是小圖的6倍,因此,縮放程序中的destW應(yīng)該是38*6=228像素。
為適應(yīng)顯示屏分辨率的變化對圖像進(jìn)行縮放時還要注意顯示屏的長寬比,不同分辨率的手機(jī)顯示屏,它們的長寬比例是不一樣的。如分辨率為240 ×320的顯示屏,長寬比是3∶4;而分辨率為320× 480的顯示屏長寬比是2∶3。在分辨率為240× 320的顯示屏上全屏顯示的圖形,在分辨率為320× 480的顯示屏上全屏顯示時會有些變形。如果這種變形我們可以容忍,我們就不要管它,如果這種變形嚴(yán)重地影響了圖像的真實(shí)性,或者不被允許,那么我們在縮放圖像時就要按照原始的基準(zhǔn)分辨率的長寬比來縮放圖像。比如,在分辨率為240×320的顯示屏上全屏顯示的圖像,如果保持長寬比,在分辨率為320×480的顯示屏上顯示的小大為320×426像素,這樣顯示才不會變形,但是在屏幕上會留有空白。
在進(jìn)行程序設(shè)計(jì)時,也應(yīng)當(dāng)注意,對于圖像適應(yīng)顯示屏分辨率的變化在實(shí)際使用過程當(dāng)中也是有局限的?,F(xiàn)有的手機(jī)顯示屏大小差別比較大。適合某一個分辨率的圖像如果過分縮小會難以分辨,如果過分放大又會出現(xiàn)失真。如果想讓自己的手機(jī)程序做到分辨率自適應(yīng),一開始選擇一個適當(dāng)?shù)幕鶞?zhǔn)分辨率也是非常重要的,有時候也要作出一點(diǎn)犧牲,干脆只針對特定的用戶群,放棄對某些分辨率的支持,如不對低端的或不對特別高端的手機(jī)屏幕進(jìn)行支持,或針對低端的手機(jī)、高端的手機(jī)分別推出不同的程序。
[1]Kim Tople.J2ME技術(shù)手冊[M].北京:中國電力出版社,2003:13.
湖北工業(yè)職業(yè)技術(shù)學(xué)院學(xué)報(bào)2011年2期