首頁 收藏 QQ群
 網(wǎng)站導航

ZNDS智能電視網(wǎng) 推薦當貝市場

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計算器

綜合交流 / 評測 / 活動區(qū)

交流區(qū) | 測硬件 | 網(wǎng)站活動 | Z幣中心

新手入門 / 進階 / 社區(qū)互助

新手 | 你問我答 | 免費刷機救磚 | ROM固件

查看: 20090|回復: 2
上一主題 下一主題
[教程]

Android游戲開發(fā)之處理按鍵的響應(yīng)方式(二十二)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式 | 未知
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。   
  1.     @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ū)別就是一個處理按下事件 一個處理抬起時間。   
  1.     @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ū)別(五)   
   
   
下面貼出代碼   
  1. 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讀取彩信附件
沙發(fā)
發(fā)表于 2014-7-27 23:38 | 只看該作者 | 來自北京
第一次接觸,下載學習一下~
回復 支持 反對

使用道具 舉報

板凳
發(fā)表于 2016-3-10 19:43 | 只看該作者 | 來自山東
感謝分享,ZNDS有你更精彩:)
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

Archiver|新帖|標簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號 )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號

GMT+8, 2025-3-19 07:36 , Processed in 0.062661 second(s), 16 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報:report#znds.com (請將#替換為@)

© 2007-2025 ZNDS.Com

快速回復 返回頂部 返回列表