1. onKeyDown 方法
onKeyDown 方法是KeyEvent.Callback 接口中的一個抽象方法,重寫onKeyDown 方法可以監聽到按鍵被按下的事件,我們先看看onKeyDown方法的函數原型。
第一個參數為鍵值,手機中每一個按鈕都擁有一個完全獨立的鍵值 通過按鍵鍵值就可以確定當前按下的是那一個按鍵。
第二個參數為按鍵事件,該對象中保存著當前按鍵的所有信息 比如 按鍵發生的時間 按鍵發生的次數 按鍵發生的類型等等。
通過以上兩個參數就可以拿到當前按鍵事件的所附帶的一切信息。
返回值 為true的時候表示完成了一次按鍵事件 這樣回調方法就會處理一些事情,舉一個簡單的例子 我們在一個新activity中 代碼中根本就沒有重寫onKeyDown這個方法可是點返回按鈕的時候發現當前這個activity自己關閉了。這是為什麼呢??
首先如果沒有重寫onKeyDown方法的話 父類就會默認調用自己的onKeyDown方法這樣如果按下按鍵了父類就會返回true 所以回調方法系統會關閉當前activity ,如果說我們把onKeyDown的返回值直接寫成false 這樣系統就不知道你點擊了返回鍵 回調方法也不會幫我們finish掉當前的activity。
Java代碼
- @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 方法的原理完全一樣 連參數都一樣, 區別就是一個處理按下事件 一個處理抬起時間。
Java代碼
- @Override
- public boolean onKeyUp(int keyCode, KeyEvent event) {
- // TODO Auto-generated method stub
- return super.onKeyUp(keyCode, event);
- }
這裡強調一下 由於android手機的種類越來越多所以不同廠商的手機的鍵值可能會不一樣的,而且有些手機根本都沒有按鍵 這樣適配型就大打折扣,不可能每款手機都寫以套代碼吧,呵呵 ,所以現在普遍的游戲都是使用全觸摸的形式在做開發,當然作為學習來說將我們可以先不管這個。
下面我給出一個簡單demo說明一下
在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代碼
- 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);
- }
- }
總體來說這章內容還是比較簡單的,老規矩每篇文章都會附帶源代碼,最後如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學習。
下載地址:http://vdisk.weibo.com/s/aahHv