在進階API編程時,你不能控制顯示在螢幕上的內容,甚至用編程方式幾乎無法控制這些組件。由系統實現體負責選取裝置的最佳顯示方式。然而,一些如遊戲類的應用程式可能需要對螢幕繪製有更多的控制。MIDP javax.microedition.lcdui包也提供了處理這類編程的低級API。
為了在螢幕直接繪製直線,文本和形狀,你必須使用Canvas類。該類提供了一個MIDlet可以在其上繪製的空白螢幕。例如,在螢幕上繪製字串"HelloWorld"。實現這個功能有一個簡單的辦法:子類化Canvas類(它是繼承自Displayable的一個抽象類別)並重載paint()方法。詳見程式碼片段1。
paint()方法的實現使用了javax.microedition.lcdui.Graphics類的繪圖功能。在方法paint()中,繪圖顏色置為紅色,然後用紅色畫一個長方形。其中,方法getWidth( )和getHeight( )分別返回Canvas對象的寬度和高度。接下來setColor( )方法把繪圖顏色設定為白色;之後,字串"Hello World!"繪製在螢幕的左上方。
樣本1:子類化Canvas
import javax.microedition.lcdui.*;
public class MyCanvas extends Canvas {
public void paint(Graphics g) {
g.setColor(255, 0, 0);
g.fillRect(0, 0, getWidth(), getHeight( ));
g.setColor(255, 255, 255);
g.drawString("Hello World!", 0, 0, g.TOP | g.LEFT);
}
}
現在,為了觀看MyCanvas,必須要把執行個體化後進行顯示。既然Canvas是Displayable的一個子類,可以用與其它screen 類使用的同樣的setCurrent( )方法來顯示它。詳見程式碼片段2。
樣本2:執行個體化和顯示MyCanvas
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class MyMidlet extends MIDlet {
public MyMidlet( ) {}
public void startApp( ) {
Canvas canvas = new MyCanvas( );
Display display = Display.getDisplay(this);
display.setCurrent(canvas);
}
public void pauseApp( ) {}
public void destroyApp(boolean unconditional) {}
}
如果你在無線開發包提供的模擬器中運行,可能得到如圖1所示的效果。注意在程式碼片段5-1中,顏色被設定為紅色與白色,但是既然使用了灰階級螢幕,這裡的彩色就被映射到黑色和白色的不同的灰階級上。試著調整顯示來觀察哪一種裝置的色彩顯示更好些。
圖1.在Canvas上繪製"Hello World!"