兩個小時精通Android開發之按鍵映射篇

作者:孫東風 2010-01-07(轉載務必註明出處)

筆者的上篇文章《兩個小時精通Android開發》中講解了利用Android的接口規範開發J2MEWrap包,從而解決了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平臺上並進行按鍵響應了:)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章