作者:孫東風 2010-01-07(轉載務必註明出處)
筆者的上篇文章《兩個小時精通Android開發》中講解了利用Android的接口規範開發J2ME的Wrap包,從而解決了J2ME程序無法運行在Android平臺上的技術難題,但是Android平臺和J2ME另一個重要的不同點就是按鍵響應接口,如何讓J2ME程序的按鍵響應可以無縫的移植到Android上呢?答案也是Wrap包。
筆者這裏通過按鍵映射把Android平臺的鍵盤碼轉換成J2ME平臺的鍵盤碼,或者把Android平臺的觸摸事件通過代理傳遞給J2ME中相應的接口。
首先,需要在Android平臺的GameCanvas裏進行如下定義:
public class GameCanvas extends Screen {
public static final int UP = 1;
public static final int DOWN = 6;
public static final int LEFT = 2;
public static final int RIGHT = 5;
public static final int FIRE = 8;
public static final int GAME_A = 9;
public static final int GAME_B = 10;
public static final int GAME_C = 11;
public static final int GAME_D = 12;
public static final int KEY_NUM0 = 48;
public static final int KEY_NUM1 = 49;
public static final int KEY_NUM2 = 50;
public static final int KEY_NUM3 = 51;
public static final int KEY_NUM4 = 52;
public static final int KEY_NUM5 = 53;
public static final int KEY_NUM6 = 54;
public static final int KEY_NUM7 = 55;
public static final int KEY_NUM8 = 56;
public static final int KEY_NUM9 = 57;
public static final int KEY_STAR = 42;
public static final int KEY_POUND = 35;
}
當然,爲了適配J2ME裏的接口筆者還定義如下的接口:
protected abstract void keyRepeated(int keyCode);
protected abstract void keyPressed(int keyCode);
protected abstract void keyReleased(int keyCode);
protected abstract void pointerPressed(int x, int y);
protected abstract void pointerReleased(int x, int y)
protected abstract void pointerDragged(int x, int y);
筆者在上面定義的都是J2ME的視圖類Canvas裏的按鍵響應接口,這裏需要做的工作就是把Android裏的按鍵進行映射轉換成J2ME裏的標準鍵值後傳遞給這些接口,並由繼承自GameCanvas的界面類進行實現,完全和J2ME裏一樣了,基本不用修改任何代碼。
鍵值映射的代碼如下:
public int keyActual = 0;
public int keyAction = 0;
public void keyPreparse(int keyCode,KeyEvent e)
{
if(keyCode == KeyEvent.KEYCODE_0)
{
keyActual = GameCanvas.KEY_NUM0;
}else if(keyCode == KeyEvent.KEYCODE_1)
{
keyActual = GameCanvas.KEY_NUM1;
}else if(keyCode == KeyEvent.KEYCODE_2)
{
keyActual = GameCanvas.KEY_NUM2;
}else if(keyCode == KeyEvent.KEYCODE_3)
{
keyActual = GameCanvas.KEY_NUM3;
}else if(keyCode == KeyEvent.KEYCODE_4)
{
keyActual = GameCanvas.KEY_NUM4;
}else if(keyCode == KeyEvent.KEYCODE_5)
{
keyActual = GameCanvas.KEY_NUM5;
}else if(keyCode == KeyEvent.KEYCODE_6)
{
keyActual = GameCanvas.KEY_NUM6;
}else if(keyCode == KeyEvent.KEYCODE_7)
{
keyActual = GameCanvas.KEY_NUM7;
}else if(keyCode == KeyEvent.KEYCODE_8)
{
keyActual = GameCanvas.KEY_NUM8;
}else if(keyCode == KeyEvent.KEYCODE_9)
{
keyActual = GameCanvas.KEY_NUM9;
}else if(keyCode == KeyEvent.KEYCODE_POUND)
{
keyActual = GameCanvas.KEY_POUND;
}else if(keyCode == KeyEvent.KEYCODE_STAR)
{
keyActual = GameCanvas.KEY_STAR;
}else if(keyCode == KeyEvent.KEYCODE_DPAD_UP)
{
keyActual = GameCanvas.UP;
keyAction = GameCanvas.UP;
}else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN)
{
keyActual = GameCanvas.DOWN;
keyAction = GameCanvas.DOWN;
}else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT)
{
keyActual = GameCanvas.LEFT;
keyAction = GameCanvas.LEFT;
}else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT)
{
keyActual = GameCanvas.RIGHT;
keyAction = GameCanvas.RIGHT;
}else if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER)
{
keyActual = GameCanvas.FIRE;
keyAction = GameCanvas.FIRE;
}
else if(keyCode == KeyEvent.KEYCODE_SOFT_LEFT)
{
keyActual = Globe.softKeyLeft;
}
else if(keyCode == KeyEvent.KEYCODE_SOFT_RIGHT)
{
keyActual = Globe.softKeyRight;
}
}
筆者對Android裏常用的鍵1~9以及*、#、上下左右、確定鍵進行了映射,映射後爲標準J2ME下的鍵值,接下來只需要把這些鍵值傳遞給原來J2ME裏的接口即可,如下:
public boolean onTouchUp(MotionEvent e) {
if (isEvent) {
return isEvent;
}
pointerReleased((int)(e.getX()),(int)(e.getY()));
return isEvent;
}
public boolean onTouchDown(MotionEvent e) {
if (isEvent) {
return isEvent;
}
pointerPressed((int)(e.getX()),(int)(e.getY()));
return isEvent;
}
public boolean onKeyDown(int keyCode, KeyEvent e) {
keyPreparse(keyCode,e);
keyPressed(keyActual);
return true;
}
public boolean onKeyUp(int keyCode, KeyEvent e) {
keyPreparse(keyCode,e);
keyReleased(keyActual);
return true;
}
前面是對觸摸事件進行的映射處理,後面是對按鍵事件進行的處理,當然,如果有需要還可以實現getGameAction()接口,如下:
public int getKeyStates()
{
return keyActual;
}
public int getGameAction(int keyCode)
{
return keyAction;
}
到這裏,讀者原來的J2ME程序基本不需要修改任何代碼就可以運行在Android平臺上並進行按鍵響應了:)