在j2me
的低階使用者介面程式設計中,進行事件處理是經常使用到的技術之一,因為處理手機鍵盤上的按鍵事件是最常使用到的一種,所以就以此為中心,介紹一下實際使用過程中三種處理方式進行說明:
1、 覆蓋
keypressed
方法在繼承了canvas
的介面中,如果需要進行按鍵的處理,我們只需要在該類中覆蓋
canvas
類裡面的這個方法,當手機按鍵被按下時,系統會自動呼叫該方法,並把被按下的按鍵的鍵值
(keycode)
作為引數傳遞進來。所以如果需要處理按鍵事件,只需要在該方法內部檢測按下的按鍵的鍵值就可以了。
在手機鍵盤上,可以簡單的分為功能鍵區域和數字鍵區域,功能鍵指手機上的左右軟鍵,中間的導航鍵以及接聽**和掛機鍵等,數字鍵區域指手機鍵盤上的0-9
數字鍵以及*號和
#號鍵。其中功能鍵的個數以及鍵值,不同的手機區別很大,而數字鍵的區域的按鍵個數,以及按鍵的鍵值都是一樣的。
檢測鍵值有如下兩種方法:
a) 直接使用
keycode
值直接使用keycode
值的**有如下兩種,分別是:
if(keycode == 52)
或者:if(keycode == canvas.key_num4)
以上是使用按鍵處理中的兩種**書寫風格,建議實際使用過程中使用第二種,這樣**容易閱讀。 而在實際的遊戲開發過程,除了一些特殊的功能鍵,例如手機上的左右軟鍵,很少使用這種方式進行編寫,而是採用下面的方式進行處理。
b) 使用
gameaction(
遊戲動作
)gameaction
是一種將手機鍵盤對映成為遊戲動作的機制,通過這種機制,可以使不同手機上的按鍵都能轉換為類似或者是相同的遊戲動作,當然這個工作是由每個手機廠商實現的。
實際使用中的**如下:
//將keycode
轉換為遊戲動作
int action = getgameaction(keycode);
其中,keycode
和遊戲動作的對應關係如下:
canvas.up——
數字鍵2
和向上導航鍵
canvas.down——
數字鍵8
和向下導航鍵
canvas.left——
數字鍵4
和向左導航鍵
canvas.right——
數字鍵6
和向右導航鍵
canvas.fire——
數字鍵5
和確定導航鍵
game_a
、game_b
、game_c
、game_d
分別對應鍵盤上的1、
3、7、
9或者是7、
9、*、
#鍵。轉換成遊戲動作以後的事件處理**如下:
switch(action)
這個就是midp1.0
中最常使用的按鍵處理方式。但是無論這種方式如何的優越,它還是無法擺脫
keypressed
方法的束縛。
這樣就將遊戲程式設計中的三種邏輯:延遲、響應使用者操作、重新繪製,隔離了開來,分別在使用者執行緒和系統執行緒中進行。
為了解決這個不足,midp2.0
在gamecanvas
內部引入了一種新的事件處理方式按鍵狀態
(keystates)
機制。2
、 使用
keystates
按鍵狀態指系統通過乙個變數來記錄手機鍵盤上每個和遊戲動作有關的按鍵,如果該鍵按下則設定對應的位(bit)為1
,否則為
0,然後可以通過位運算獲得哪個按鍵被按下。
注意:按鍵狀態只能在midp2.0
的gamecanvas
子類中裡面使用,而且只能處理和遊戲相關的按鍵。如果支援該處理方式處理遊戲按鍵的話,將在
keypressed
方法中無法接收到和遊戲相關的按鍵,其他按鍵還可以正常接收響應。
如果要使用該功能,首先要在gamecanvas
子類的構造方法中,讓該介面支援該操作,這個步驟可以使用
gamecanvas
的構造方法來實現,**如下:
//使該介面支援按鍵狀態處理
super(true);
這樣該介面就可以進行按鍵狀態處理。和前面的按鍵處理不同,該種處理方式可以脫離keypressed
使用該處理方式,無論執行緒中的延遲多麼長,系統都可以保持該按鍵的狀態。這個好處是其他處理方式無法做到的。
首先,獲得遊戲按鍵狀態,**如下:
//獲得遊戲的按鍵狀態
int states = getkeystates();
該**的作用是獲得當前按鍵狀態,並把按鍵狀態清空!具體的處理**如下:
//處理按鍵狀態:
if((states & gamecanvas.left_pressed) != 0)
if((states & gamecanvas. right_pressed) != 0)
在midp2.0
的game api
處理中,這個方式使手機遊戲開發重新回歸到傳統的模式中,也使遊戲的處理更加靈活。
J2ME 關於移動的主頁推送對J2ME程式的影響
中國移動於5月17日推出費用提示頁面,其實早在5月15日測試j2me程式的時候就發現已經有頁面推送了。5月15日早上照常測試我的j2me聯網程式發現在模擬器一切正常,但是到了真機上卻得不到正確的資料,後來發現是第一次鏈結得到的資料流正是移動推送的頁面資料。經過試驗,其實得到第乙個頁面不用管它,繼續重...
J2ME中的分而治之
這兩天在研究j2me中setclip的用法.兩張切換時,如果是新的從內向外以矩形顯示,可以使用一次setclip設定繪製的矩形區域.但是,現在反回來,從外向內,以矩形框顯示,但是j2me裡面沒有這樣的方法,怎麼辦?有了,咱們給他來個分而治之,一次setclip不行,咱們可以分多次嘛.就現在的情況,可...
log4j2me 開源的j2me日誌工具
原文 log4j2me是用於j2me平台上的log4j。當把你的 移到j2se j2ee平台上時,不需要對 進行改變,只需把log4j2me.jar替換掉log4jjar檔案。與log4j所不同的是不能在j2me環境中使用log4j.properties檔案來配置log4j,但可以從 jad檔案讀取...