Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android游戲 >> Android游戲開發 >> Android游戲開發教程之一:長按事件的原理

Android游戲開發教程之一:長按事件的原理

編輯:Android游戲開發

       本系列教程講解的是Android游戲開發,大家都應該知道,Android Market下載量比較多的都是游戲。將來如果手機網游發展起來的話,Android會因為使用Java從而比iPhone的入門門檻更低。

       本Android游戲開發教程概述

       本游戲開發教程主要從控制方法(按鍵、軌跡球、觸屏、重力感應、攝像頭、話筒氣流、光線亮度)、圖形View(高效繪圖技術如雙緩沖)、音效(游戲音樂)以及最後的OpenGL ES(Java層)和NDK的OpenGL和J2ME游戲移植到Android方法,當然還有一些游戲實現慣用方法,比如地圖編輯器,在Android OpenGL如何使用MD2文件,各部分講述下Android游戲開發的過程最終實現一個比較完整的游戲引擎。

       長按事件的原理及代碼示例

       對於很多游戲使用屏幕控制一般需要考慮長按事件,比如在動作類的游戲中需要長按發射武器,結合Android Button模型,我們實現一個帶圖片的Button的長按,為了更清晰的顯示原理,Android開發網這裡使用ImageButton作為基類。

Java代碼
  1. public class RepeatingImageButton extends ImageButton {   
  2.   
  3.    private long mStartTime; //記錄長按開始   
  4.    private int mRepeatCount; //重復次數計數   
  5.    private RepeatListener mListener;   
  6.    private long mInterval = 500; //Timer觸發間隔,即每0.5秒算一次按下   
  7.       
  8.    public RepeatingImageButton(Context context) {   
  9.        this(context, null);   
  10.    }   
  11.   
  12.    public RepeatingImageButton(Context context, AttributeSet attrs) {   
  13.        this(context, attrs, android.R.attr.imageButtonStyle);   
  14.    }   
  15.   
  16.    public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) {   
  17.        super(context, attrs, defStyle);   
  18.        setFocusable(true); //允許獲得焦點   
  19.        setLongClickable(true); //啟用長按事件   
  20.    }   
  21.       
  22.    public void setRepeatListener(RepeatListener l, long interval) { //實現重復按下事件listener   
  23.        mListener = l;   
  24.        mInterval = interval;    
  25.    }   
  26.       
  27.    @Override  
  28.    public boolean performLongClick() {   
  29.        mStartTime = SystemClock.elapsedRealtime();   
  30.        mRepeatCount = 0;   
  31.        post(mRepeater);   
  32.        return true;   
  33.    }   
  34.   
  35.   
  36.       
  37.    @Override  
  38.    public boolean onTouchEvent(MotionEvent event) {   
  39.        if (event.getAction() == MotionEvent.ACTION_UP) {  //   本方法原理同onKeyUp的一樣,這裡處理屏幕事件,下面的onKeyUp處理Android手機上的物理按鍵事件   
  40.              removeCallbacks(mRepeater);     
  41.            if (mStartTime != 0) {   
  42.                doRepeat(true);   
  43.                mStartTime = 0;   
  44.            }   
  45.        }   
  46.        return super.onTouchEvent(event);   
  47.    }   
  48.   
  49.  //處理導航鍵事件的中鍵或軌跡球按下事件   
  50.   
  51.    @Override  
  52.    public boolean onKeyDown(int keyCode, KeyEvent event) {   
  53.        switch (keyCode) {   
  54.            case KeyEvent.KEYCODE_DPAD_CENTER:    
  55.            case KeyEvent.KEYCODE_ENTER:   
  56.   
  57.                super.onKeyDown(keyCode, event);   
  58.                return true;   
  59.        }   
  60.        return super.onKeyDown(keyCode, event);   
  61.    }   
  62.   
  63.   //當按鍵彈起通知長按結束   
  64.   
  65.    @Override  
  66.    public boolean onKeyUp(int keyCode, KeyEvent event) {   
  67.        switch (keyCode) {   
  68.        case KeyEvent.KEYCODE_DPAD_CENTER:   
  69.        case KeyEvent.KEYCODE_ENTER:   
  70.              
  71.            removeCallbacks(mRepeater); //取消重復listener捕獲   
  72.            if (mStartTime != 0) {   
  73.                doRepeat(true); //如果長按事件累計時間不為0則說明長按了   
  74.                mStartTime = 0; //重置長按計時器   
  75.            }   
  76.        }   
  77.        return super.onKeyUp(keyCode, event);   
  78.    }   
  79.       
  80.    private Runnable mRepeater = new Runnable() {  //在線程中判斷重復   
  81.        public void run() {   
  82.            doRepeat(false);   
  83.            if (isPressed()) {   
  84.                postDelayed(this, mInterval); //計算長按後延遲下一次累加   
  85.            }   
  86.        }   
  87.    };   
  88.   
  89.    private  void doRepeat(boolean last) {   
  90.        long now = SystemClock.elapsedRealtime();   
  91.        if (mListener != null) {   
  92.            mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);   
  93.        }   
  94.    }   
  95.   
  96.   //下面是重復Button Listener接口的定義,調用時在Button中先使用setRepeatListener()方法實現RepeatListener接口   
  97.       
  98.    public interface RepeatListener {   
  99.             void onRepeat(View v, long duration, int repeatcount); //參數一為用戶傳入的Button對象,參數二為延遲的毫秒數,第三位重復次數回調。   
  100.    }   
  101. }

       本類大家可以直接在自己的View中implements實現RepeatListener接口即可。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved