Android中的實現長按事件
對于很多游戲使用屏幕控制一般需要考慮長按事件,比如在動作類的游戲中需要長按發射武器,結合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對象,參數二為延遲的毫秒數,第三位重復次數回調。 } }
本類大家可以直接在自己的View中implements實現RepeatListener接口即可.
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!