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