Canvas類的應用

javaprogramers發表於2005-03-25
      當我們選擇了Canvas這個類,就意味著我們準備採用低階API,之所以稱之為低階API,

並不是因為它很低能,恰恰相反,我們可用它來處理一些很底層的系統事件,具體如何支援,

我們要看硬體上的支援程度來判定。

      所有的低階API都是從javax.microedition.lcdui.Canvas開始,我們必須繼承Canvas,才

可以建立一個顯示在螢幕上的畫面,需要注意的是每一個Canvas裡面必須有一個抽象方法

paint(),並且需要傳入一個Graphics的引用,可以說Canvas的精華就在這個paint()方法裡面,

我們用這個方法來負責這個螢幕畫面的描繪。

        任何時候我們都可以用repaint()來產生重繪事件,repaint()一共有兩個同名方法,其中

一個需要四個引數,分別是起始座標(x,y),還有寬度和高度,另外一個不需要任何引數,

它是代表整個螢幕全部重新繪製,由此看來,前者的效率較後者要高,實際開發中也大多數是

用前者而不是後者,我們呼叫了repaint()之後,會立刻返回,呼叫paint()則是由另外一個專

門處理UI的執行緒來完成,如果我們希望等到paint()完成後再返回,我們可以在repaint()方法

後加一個serviceRepaints()方法,它的作用是強制佇列中的重繪事件儘快完成,如果佇列中無

重繪事件,它就什麼也不會做,因此呼叫repaint()方法的時候,我們通常會在後面加一個

serviceRepaints()方法。

我們在手機上繪製圖象的座標系和我們通常所見的座標系是不一樣的:

通常的座標系原點是在左下角,在第一個90度扇區繪圖;
 
MIDP中的座標系原點在左上角,在第四個90度扇區繪圖;
 
這是我們在繪製圖象時要注意的。

 
下面我們來講一講Graphics這個物件,我們可以把它當作一個白紙,只要呼叫這個方法,我們

就可以運用自己的想象力在這張白紙上畫出自己想要的圖案。

 
下面我用一段簡單的程式碼來說明一下這個Graphics物件的應用:

import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class test extends Canvas

{

public void paint(Graphics g)

{

        g.setColor(255,255,0);

        g.fillRect(0,0,getWidth(),getHeight());

        int c=g.getColor();

        int dc=g.getDisplayColor(g.getColor());

        System.out.println("當前畫面的顏色為:"+Integer.toHexString(c));

        System.out.println("當前畫面的R值為:"+g.getRedComponent());

        System.out.println("當前畫面的G值為:"+g.getGreenComponent());

              System.out.println("當前畫面的B值為:"+g.getBlueComponent());

        System.out.println("當前畫面的顯示顏色為:"+Integer.toHexString(dc));

        System.out.println("當前畫面的灰度為:"+g.getGrayScale());

}

}

需要大家注意的是R,G,B的值只能在0——255之間,不可以超出這個範圍,另外我們可以直

接用0x00RRGGBB格式進行顏色的調配。

 
      上面的程式碼簡要說了一下Graphics幾個重要的引數如何獲得,下面我們就來談一談如何用

Graphics做具體的圖形,如果我們需要繪製一條直線,我們可以呼叫drawLine()方法,需要定

義其開始座標和結束座標,共四個引數,同時,Graphics提供兩種形式的線條,一個是虛線,

即Graphics.DOTTED,一個是實線,即Graphics.SOLID,同樣我們給出一段程式碼供大家參考:


import javax.microedition.lcdui.*;

import javax.microedition.midlet.*;

 

public class GraphicsTestCanvas2 extends Canvas

{

       public void paint(Graphics g)

       {

              g.setColor(255,255,255);

              g.fillRect(0,0,getWidth(),getHeight());

              g.setColor(255,0,0);

           g.drawLine(1,1,100,10);

           g.setStrokeStyle(Graphics.DOTTED);

       }

}

用類似的方法,我們可以實現用Graphics的drawRect()和drawRoundRect()方法來繪製矩形

和圓角矩形,具體的方法應用,大家可以見WTK包的說明文件。

 
下面我們來說一說Canvas的螢幕事件處理。

 
Canvas本身有兩種狀態,一種是普通預設情況下的,一種是全屏狀態,可以用setFullScreen

Mode()方法來對其設定,兩者之間的區別在於當我們使用全螢幕狀態的時候,Title,Ticker,以

及我們的Command都無法在螢幕上顯示,而且當我們呼叫setFullScreenMode()的時候,不管

是什麼模式,都會呼叫seizeChanged()這個方法,並傳入螢幕的高度和寬度作為其引數,對於

某些突發事件,比如說來電等等,螢幕會被系統畫面所覆蓋的時候,就會呼叫hideNotify()這

個方法,當恢復原狀時,就會呼叫我們原本的畫面,那麼系統就會同時呼叫showNotify()這個

方法。

      在Canvas裡面我們每按下一個按鍵都會觸發keyPressed()函式,並傳入相應位置的整數

值,我們在MIDP規範中可以很容易的發現,KEY_NUM0——KEY——NUM9十個常數分別代表

鍵盤上的0-9,還有兩個功能鍵,KEY_STAR,KEY_POUND,如果我們傳入的值小於0,代表我們

傳入了不合法的keycode,某些機器上還支援連續按鍵響應,但這並不是JTWI規定要支援的,

所以我們在進行實際開發之前一定要用我們前面講到的hasRepeatEvents()方法來進行判定。


      在索愛P910C這樣的高階手機上,還支援螢幕的觸控事件,同樣這也不是JTWI做了硬性

規定,所以我們實際開發中也要進行測試,我們在螢幕上點選,可以引發pointerPressed()函

數,並傳入當時位置的座標,放開後,會引發pointerReleased()函式,同樣也會傳入座標,具

體的使用方法和keyPressed()以及keyReleased()大同小異,大家可以參考一下WTK的說明文

檔獲得比較詳細的方法使用規則。

相關文章