Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android游戲 >> Android游戲開發 >> Android游戲開發教程之十二:處理按鍵的響應

Android游戲開發教程之十二:處理按鍵的響應

編輯:Android游戲開發

  1. onKeyDown 方法

  onKeyDown 方法是KeyEvent.Callback 接口中的一個抽象方法,重寫onKeyDown 方法可以監聽到按鍵被按下的事件,我們先看看onKeyDown方法的函數原型。

  第一個參數為鍵值,手機中每一個按鈕都擁有一個完全獨立的鍵值 通過按鍵鍵值就可以確定當前按下的是那一個按鍵。

  第二個參數為按鍵事件,該對象中保存著當前按鍵的所有信息 比如 按鍵發生的時間 按鍵發生的次數  按鍵發生的類型等等。

  通過以上兩個參數就可以拿到當前按鍵事件的所附帶的一切信息。

  返回值 為true的時候表示完成了一次按鍵事件 這樣回調方法就會處理一些事情,舉一個簡單的例子 我們在一個新activity中 代碼中根本就沒有重寫onKeyDown這個方法可是點返回按鈕的時候發現當前這個activity自己關閉了。這是為什麼呢??

  首先如果沒有重寫onKeyDown方法的話 父類就會默認調用自己的onKeyDown方法這樣如果按下按鍵了父類就會返回true 所以回調方法系統會關閉當前activity ,如果說我們把onKeyDown的返回值直接寫成false 這樣系統就不知道你點擊了返回鍵 回調方法也不會幫我們finish掉當前的activity。

Java代碼
  1. @Override  
  2. public boolean onKeyDown(int keyCode, KeyEvent event) {   
  3.     return super.onKeyDown(keyCode, event);  
  4. }  

  如果長按某一個按鍵的話 onKeyDown方法會反復調用 並不是只調用一次  直到松開該按鍵為止。

  2. onKeyUp 方法

  onKeyUp  方法和 onKeyDown 同屬於KeyEvent.Callback 接口中的一個抽象方法 ,重寫onKeyUp  方法可以監聽到按鍵被抬起的事件,當然抬起的前提肯定是先被按下後才會被抬起,也就是說onKeyUp  方法如果執行那也肯定是先執行過 onKeyDown 方法。我們先看看onKeyUp 的函數原型。

  它和onKeyDown 方法的原理完全一樣 連參數都一樣, 區別就是一個處理按下事件 一個處理抬起時間。

Java代碼
  1. @Override  
  2. public boolean onKeyUp(int keyCode, KeyEvent event) {  
  3.     // TODO Auto-generated method stub  
  4.     return super.onKeyUp(keyCode, event);  
  5. }  

  這裡強調一下 由於android手機的種類越來越多所以不同廠商的手機的鍵值可能會不一樣的,而且有些手機根本都沒有按鍵  這樣適配型就大打折扣,不可能每款手機都寫以套代碼吧,呵呵 ,所以現在普遍的游戲都是使用全觸摸的形式在做開發,當然作為學習來說將我們可以先不管這個。

  下面我給出一個簡單demo說明一下

Android游戲開發教程之十二:處理按鍵的響應

  在View中須要監聽按鍵的話必需在構造方法中給當前View 設置控制焦點 須要調用 setFocusable(true); 如果沒有設置的話 onKeyDown 與onKeyUp 等跟按鍵有關的 永遠無法監聽到按鍵事件。 在onKeyDown 與onKeyUp 通過keyCode 的值就可以判斷當前按下那一個按鍵 ,然後根據event 事件對象就可以拿到當前觸發事件的時間等等。

  代碼中我在Activity 和View中同時重寫onKeyDown 與onKeyUp方法,他們的調用順序是先是調用自定義View中的 onKeyDown 與onKeyUp方法  然後才是 調用Activity中的onKeyDown 與onKeyUp方法,所以我們可以在相應的方法中做出相應的事情。

  在按鍵監聽的這個activity中點擊返回鍵  因為它重寫方法 onKeyDown 與onKeyUp 所以返回值 會調用父類onKeyDown方法  return super.onKeyDown(keyCode, event); 這樣的話父類就會返回true 所以系統拿到返回事件後就直接幫我們把activity關閉掉了,如果把這一句改成false 我們當前的這個activity就不會被系統finish掉除非我們自己手動finish掉。 所以可以通過設置返回值的方式來攔截按鍵信息喔。

  postInvalidate(); 方法就是通知UI線程重繪 也就是說我們調用 postInvalidate();  後 緊接著系統就會調用onDraw方法來刷新屏幕。

  下面貼出代碼

Java代碼
  1. package cn.m15.xys;  
  2.    
  3. import android.app.Activity;  
  4. import android.content.Context;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Color;  
  7. import android.graphics.Paint;  
  8. import android.os.Bundle;  
  9. import android.view.KeyEvent;  
  10. import android.view.View;  
  11. import android.view.Window;  
  12. import android.view.WindowManager;  
  13.    
  14. public class SurfaceViewAcitvity extends Activity {  
  15.    
  16.     AnimView mAnimView = null;  
  17.    
  18.     @Override  
  19.     public void onCreate(Bundle savedInstanceState) {  
  20.     super.onCreate(savedInstanceState);  
  21.     // 全屏顯示窗口  
  22.     requestWindowFeature(Window.FEATURE_NO_TITLE);  
  23.     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  24.         WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  25.     // 顯示自定義的游戲View  
  26.     mAnimView = new AnimView(this);  
  27.     setContentView(mAnimView);  
  28.     }  
  29.    
  30.     public class AnimView extends View {  
  31.    
  32.      String mKeyDownEvent = "點擊鍵盤方向鍵";  
  33.      String mKeyDownTime = "";  
  34.      String mKeyUpEvent = "";  
  35.      String mKeyUpTime = "";  
  36.    
  37.      Paint mPaint = null;  
  38.      /** 
  39.      * 構造方法 
  40.      * 
  41.      * @param context 
  42.      */  
  43.     public AnimView(Context context) {  
  44.         super(context);  
  45.         mPaint = new Paint();  
  46.         /**設置控制焦點 **/  
  47.         setFocusable(true);  
  48.     }  
  49.    
  50.     @Override  
  51.     protected void onDraw(Canvas canvas) {  
  52.         /**顯示內容**/  
  53.         mPaint.setColor(Color.WHITE);  
  54.         canvas.drawText(mKeyDownEvent, 100, 20, mPaint);  
  55.         canvas.drawText(mKeyDownTime, 100, 40, mPaint);  
  56.         canvas.drawText(mKeyUpEvent, 100, 60, mPaint);  
  57.         canvas.drawText(mKeyUpTime, 100, 80, mPaint);  
  58.         super.onDraw(canvas);  
  59.     }  
  60.    
  61.     @Override  
  62.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  63.         switch (keyCode) {  
  64.         case KeyEvent.KEYCODE_DPAD_UP:  
  65.         mKeyDownEvent = "按下了上鍵";  
  66.         break;  
  67.         case KeyEvent.KEYCODE_DPAD_DOWN:  
  68.         mKeyDownEvent = "按下了下鍵";  
  69.         break;  
  70.         case KeyEvent.KEYCODE_DPAD_LEFT:  
  71.         mKeyDownEvent = "按下了左鍵";  
  72.         break;  
  73.         case KeyEvent.KEYCODE_DPAD_RIGHT:  
  74.         mKeyDownEvent = "按下了右鍵";  
  75.         break;  
  76.         case KeyEvent.KEYCODE_DPAD_CENTER:  
  77.         mKeyDownEvent = "按下了中鍵";  
  78.         break;  
  79.         case KeyEvent.KEYCODE_1:  
  80.         mKeyDownEvent = "按下了數字鍵1";  
  81.         break;  
  82.         case KeyEvent.KEYCODE_3:  
  83.         mKeyDownEvent = "按下了數字鍵2";  
  84.         break;  
  85.         case KeyEvent.KEYCODE_7:  
  86.         mKeyDownEvent = "按下了數字鍵7";  
  87.         break;  
  88.         default:  
  89.         mKeyDownEvent = String.valueOf(keyCode);  
  90.         break;  
  91.         }  
  92.         mKeyDownTime = "觸發當前事件的時間為" + event.getEventTime();  
  93.         /**通知UI線程重繪**/  
  94.         postInvalidate();  
  95.         return super.onKeyDown(keyCode, event);  
  96.     }  
  97.    
  98.     @Override  
  99.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  100.         switch (keyCode) {  
  101.         case KeyEvent.KEYCODE_DPAD_UP:  
  102.         mKeyUpEvent = "抬起了上鍵";  
  103.         break;  
  104.         case KeyEvent.KEYCODE_DPAD_DOWN:  
  105.         mKeyUpEvent = "抬起了下鍵";  
  106.         break;  
  107.         case KeyEvent.KEYCODE_DPAD_LEFT:  
  108.         mKeyUpEvent = "抬起了左鍵";  
  109.         break;  
  110.         case KeyEvent.KEYCODE_DPAD_RIGHT:  
  111.         mKeyUpEvent = "抬起了右鍵";  
  112.         break;  
  113.         case KeyEvent.KEYCODE_DPAD_CENTER:  
  114.         mKeyUpEvent = "抬起了中鍵";  
  115.         break;  
  116.         case KeyEvent.KEYCODE_1:  
  117.         mKeyUpEvent = "抬起了數字鍵1";  
  118.         break;  
  119.         case KeyEvent.KEYCODE_3:  
  120.         mKeyUpEvent = "抬起了數字鍵2";  
  121.         break;  
  122.         case KeyEvent.KEYCODE_7:  
  123.         mKeyUpEvent = "抬起了數字鍵7";  
  124.         break;  
  125.         default:  
  126.         mKeyUpEvent = String.valueOf(keyCode);  
  127.         break;  
  128.         }  
  129.    
  130.         mKeyUpTime = "觸發當前事件的時間為" + event.getEventTime();  
  131.         /**通知UI線程重繪**/  
  132.         postInvalidate();  
  133.         return super.onKeyUp(keyCode, event);  
  134.     }  
  135.     }  
  136.    
  137.     @Override  
  138.     public boolean onKeyDown(int keyCode, KeyEvent event) {  
  139.    
  140.     return super.onKeyDown(keyCode, event);  
  141.     }  
  142.     @Override  
  143.     public boolean onKeyUp(int keyCode, KeyEvent event) {  
  144.         // TODO Auto-generated method stub  
  145.         return super.onKeyUp(keyCode, event);  
  146.     }  
  147. }  

  總體來說這章內容還是比較簡單的,老規矩每篇文章都會附帶源代碼,最後如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學習。

  下載地址:http://vdisk.weibo.com/s/aahHv

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved