Android遊戲開發之一

來源:互聯網
上載者:User

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

public class RepeatingImageButton
extends ImageButton { 
     private long mStartTime; //記錄長按開始   
   private int mRepeatCount; //重複次數計數     
 private RepeatListener mListener;     
 private long mInterval = 500;
//Timer觸發間隔,即每0.5秒算一次按下   
   public RepeatingImageButton(Context context) {  
        this(context, null);   
   }       public RepeatingImageButton(Context context, AttributeSet attrs) {    
      this(context, attrs, android.R.attr.imageButtonStyle); 
     }       public RepeatingImageButton(Context context, AttributeSet attrs, int defStyle) {    
      super(context, attrs, defStyle);       
   setFocusable(true);
 //允許獲得焦點           setLongClickable(true);
//啟用長按事件       }   
   public void setRepeatListener(RepeatListener l,
long interval) { //實現重複按下事件listener           mListener = l; 
         mInterval = interval;     
  }       @Override      public boolean performLongClick() {      
    mStartTime = SystemClock.elapsedRealtime();    
      mRepeatCount = 0;       
   post(mRepeater);      
    return true;       }       @Override   
  public boolean onTouchEvent(MotionEvent event) {  
        if (event.getAction() == MotionEvent.ACTION_UP) {  //
  本方法原理同onKeyUp的一樣,這裡處理螢幕事件,下面的onKeyUp處理Android手機上的物理按鍵事件    
            removeCallbacks(mRepeater);           
     if (mStartTime != 0) {             
     doRepeat(true);     
             mStartTime = 0;       
       }           }       
   return super.onTouchEvent(event);  
    }     //處理導航鍵事件的中鍵或軌跡球按下事件       @Override   
  public boolean onKeyDown(int keyCode, KeyEvent event) {       
   switch (keyCode) {               case KeyEvent.KEYCODE_DPAD_CENTER:      
         case KeyEvent.KEYCODE_ENTER:       
              super.onKeyDown(keyCode, event);          
        return true; 
         }           return super.onKeyDown(keyCode, event);    
  }      //當按鍵彈起通知長按結束       @Override   
  public boolean onKeyUp(int keyCode, KeyEvent event) {       
   switch (keyCode) {           case KeyEvent.KEYCODE_DPAD_CENTER:    
      case KeyEvent.KEYCODE_ENTER:       
                     removeCallbacks(mRepeater); //取消重複listener捕獲      
        if (mStartTime != 0) {                
  doRepeat(true); //如果長按事件累計時間不為0則說明長按了      
            mStartTime = 0; //重設長按計時器               }           }      
    return super.onKeyUp(keyCode, event);    
  }       private Runnable mRepeater = new Runnable() {  //線上程中判斷重複     
     public void run() {               doRepeat(false);     
         if (isPressed()) {                   postDelayed(this, mInterval);
 //計算長按後延遲下一次累加               }           }       };   
   private  void doRepeat(boolean last) {      
    long now = SystemClock.elapsedRealtime();    
      if (mListener != null) {         
     mListener.onRepeat(this, now - mStartTime, last ? -1 : mRepeatCount++);  
        }       }      //下面是重複Button Listener介面的定義,
調用時在Button中先使用setRepeatListener()方法實現RepeatListener介面         
    public interface RepeatListener {            
   void onRepeat(View v, long duration, int repeatcount); //參數一為使用者傳入的Button對象,參數二為延遲的毫秒數,第三位重複次數回調。       }    }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.