|
Android游戲開發(fā)之處理按鍵的響應(yīng)方式
1.onKeyDown 方法
onKeyDown 方法是KeyEvent.Callback 接口中的一個抽象方法,重寫onKeyDown 方法可以監(jiān)聽到按鍵被按下的事件,我們先看看onKeyDown方法的函數(shù)原型。
第一個參數(shù)為鍵值,手機中每一個按鈕都擁有一個完全獨立的鍵值 通過按鍵鍵值就可以確定當前按下的是那一個按鍵。
第二個參數(shù)為按鍵事件, 該對象中保存著當前按鍵的所有信息 比如 按鍵發(fā)生的時間 按鍵發(fā)生的次數(shù) 按鍵發(fā)生的類型等等。
通過以上兩個參數(shù)就可以拿到當前按鍵事件的所附帶的一切信息。
返回值 為true的時候表示完成了一次按鍵事件 這樣回調(diào)方法就會處理一些事情,舉一個簡單的例子 我們在一個新activity中 代碼中根本就沒有重寫onKeyDown這個方法可是點返回按鈕的時候發(fā)現(xiàn)當前這個activity自己關(guān)閉了。這是為什么呢??
首先如果沒有重寫onKeyDown方法的話 父類就會默認調(diào)用自己的onKeyDown方法這樣如果按下按鍵了父類就會返回true 所以回調(diào)方法系統(tǒng)會關(guān)閉當前activity ,如果說我們把onKeyDown的返回值直接寫成false 這樣系統(tǒng)就不知道你點擊了返回鍵 回調(diào)方法也不會幫我們finish掉當前的activity。 - @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
return super.onKeyDown(keyCode, event);
}
復制代碼 如果長按某一個按鍵的話 onKeyDown方法會反復調(diào)用 并不是只調(diào)用一次 直到松開該按鍵為止。
2.onKeyUp 方法
onKeyUp 方法和 onKeyDown 同屬于KeyEvent.Callback 接口中的一個抽象方法 ,重寫onKeyUp 方法可以監(jiān)聽到按鍵被抬起的事件,當然抬起的前提肯定是先被按下后才會被抬起,也就是說onKeyUp 方法如果執(zhí)行那也肯定是先執(zhí)行過 onKeyDown 方法。我們先看看onKeyUp 的函數(shù)原型。
它和onKeyDown 方法的原理完全一樣 連參數(shù)都一樣, 區(qū)別就是一個處理按下事件 一個處理抬起時間。 - @Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
return super.onKeyUp(keyCode, event);
}
復制代碼 這里強調(diào)一下 由于android手機的種類越來越多所以不同廠商的手機的鍵值可能會不一樣的,而且有些手機根本都沒有按鍵 這樣適配型就大打折扣,不可能每款手機都寫以套代碼吧,呵呵 ,所以現(xiàn)在普遍的游戲都是使用全觸摸的形式在做開發(fā),當然作為學習來說將我們可以先不管這個。
下面我給出一個簡單demo說明一下
在View中須要監(jiān)聽按鍵的話必需在構(gòu)造方法中給當前View 設(shè)置控制焦點 須要調(diào)用 setFocusable(true); 如果沒有設(shè)置的話 onKeyDown 與onKeyUp 等跟按鍵有關(guān)的 永遠無法監(jiān)聽到按鍵事件。 在onKeyDown 與onKeyUp 通過keyCode 的值就可以判斷當前按下那一個按鍵 ,然后根據(jù)event 事件對象就可以拿到當前觸發(fā)事件的時間等等。
代碼中我在Activity 和View中同時重寫onKeyDown 與onKeyUp方法,他們的調(diào)用順序是先是調(diào)用自定義View中的 onKeyDown 與onKeyUp方法 然后才是 調(diào)用Activity中的onKeyDown 與onKeyUp方法,所以我們可以在相應(yīng)的方法中做出相應(yīng)的事情。
在按鍵監(jiān)聽的這個activity中點擊返回鍵 因為它重寫方法 onKeyDown 與onKeyUp 所以返回值 會調(diào)用父類onKeyDown方法 return super.onKeyDown(keyCode, event); 這樣的話父類就會返回true 所以系統(tǒng)拿到返回事件后就直接幫我們把activity關(guān)閉掉了,如果把這一句改成false 我們當前的這個activity就不會被系統(tǒng)finish掉除非我們自己手動finish掉。 所以可以通過設(shè)置返回值的方式來攔截按鍵信息喔。
postInvalidate(); 方法就是通知UI線程重繪 也就是說我們調(diào)用 postInvalidate(); 后 緊接著系統(tǒng)就會調(diào)用onDraw方法來刷新屏幕。 具體相關(guān)內(nèi)容見Android游戲開發(fā)之構(gòu)建游戲框架View與SurFaceView的區(qū)別(五)
下面貼出代碼 - 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;
/**
* 構(gòu)造方法
*
* @param context
*/
public AnimView(Context context) {
super(context);
mPaint = new Paint();
/**設(shè)置控制焦點 **/
setFocusable(true);
}
@Override
protected void onDraw(Canvas canvas) {
/**顯示內(nèi)容**/
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 = "按下了數(shù)字鍵1";
break;
case KeyEvent.KEYCODE_3:
mKeyDownEvent = "按下了數(shù)字鍵2";
break;
case KeyEvent.KEYCODE_7:
mKeyDownEvent = "按下了數(shù)字鍵7";
break;
default:
mKeyDownEvent = String.valueOf(keyCode);
break;
}
mKeyDownTime = "觸發(fā)當前事件的時間為" + 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 = "抬起了數(shù)字鍵1";
break;
case KeyEvent.KEYCODE_3:
mKeyUpEvent = "抬起了數(shù)字鍵2";
break;
case KeyEvent.KEYCODE_7:
mKeyUpEvent = "抬起了數(shù)字鍵7";
break;
default:
mKeyUpEvent = String.valueOf(keyCode);
break;
}
mKeyUpTime = "觸發(fā)當前事件的時間為" + 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);
}
}
復制代碼 總體來說這章內(nèi)容還是比較簡單的,老規(guī)矩每篇文章都會附帶源代碼,最后如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學習
第十二講 按鍵的處理.rar(110.45 KB, 下載次數(shù): 202)[/I]2011-9-3 00:48 上傳點擊文件名 下載積分: 下載豆 -2 |
上一篇: 二維碼簡化下一篇: Android讀取彩信附件
|