Android中的按鈕長按事件。

來源:互聯網
上載者:User

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

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

下面是重複Button Listener介面的定義,調用時在Button中先使用setRepeatListener()方法實現RepeatListener介面

  1.     public interface RepeatListener {
  2.             void onRepeat(View v, long duration, int repeatcount); //參數一為使用者傳入的Button對象,參數二為延遲的毫秒數,第三位重複次數回調。
  3.     }
  4. }

本類大家可以直接在自己的View中implements實現RepeatListener介面即可.

相關文章

聯繫我們

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

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

Tags Index: