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

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

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

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

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

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

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

新手 | 你問我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 18731|回復(fù): 2
上一主題 下一主題
[教程]

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式 | 未知
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。   
  1.     @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í)間。   
  1.     @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ū)別(五)   
   
   
下面貼出代碼   
  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 = "點(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讀取彩信附件
沙發(fā)
發(fā)表于 2014-7-27 23:38 | 只看該作者 | 來自北京
第一次接觸,下載學(xué)習(xí)一下~
板凳
發(fā)表于 2016-3-10 19:43 | 只看該作者 | 來自山東
感謝分享,ZNDS有你更精彩:)
您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

GMT+8, 2024-11-20 22:33 , Processed in 0.071976 second(s), 17 queries , Redis On.

Powered by Discuz!

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

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表