Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android研究之游戲開發處理按鍵的響應

Android研究之游戲開發處理按鍵的響應

編輯:關於Android編程

1.onKeyDown 方法

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

第一個參數為鍵值,手機中每一個按鈕都擁有一個完全獨立的鍵值 通過按鍵鍵值就可以確定當前按下的是那一個按鍵。
第二個參數為按鍵事件, 該對象中保存著當前按鍵的所有信息 比如 按鍵發生的時間 按鍵發生的次數 按鍵發生的類型等等。
通過以上兩個參數就可以拿到當前按鍵事件的所附帶的一切信息。對太鼓達人游戲感興趣的看Android研究之游戲開發太鼓達人游戲

返回值 為true的時候表示完成了一次按鍵事件 這樣回調方法就會處理一些事情,舉一個簡單的例子 我們在一個新activity中 代碼中根本就沒有重寫onKeyDown這個方法可是點返回按鈕的時候發現當前這個activity自己關閉了。這是為什麼呢??
首先如果沒有重寫onKeyDown方法的話 父類就會默認調用自己的onKeyDown方法這樣如果按下按鍵了父類就會返回true 所以回調方法系統會關閉當前activity ,如果說我們把onKeyDown的返回值直接寫成false 這樣系統就不知道你點擊了返回鍵 回調方法也不會幫我們finish掉當前的activity。


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

 

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

2.onKeyUp 方法

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

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


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

 

這裡強調一下 由於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方法來刷新屏幕。

下面貼出代碼


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

 

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

 

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