Work around的方法是先監聽onTouch事件來監聽連續點擊次數,每次點擊都布置一個間隔時間的延時任務,延時任務執行時判斷間隔內是否還有點擊,如果沒有則發布點擊次數,重置計數。
實現代碼如下:
/** * 連續點擊事件監聽器 可以用作雙擊事件 * */ public abstract class OnMultiTouchListener implements OnTouchListener { /** * 上次 onTouch 發生的時間 */ private long lastTouchTime = 0; /** * 已經連續 touch 的次數 */ private AtomicInteger touchCount = new AtomicInteger(0); private Runnable mRun = null; public void removeCallback() { if (mRun != null) { getMainLoopHandler().removeCallbacks(mRun); mRun = null; } } @Override public boolean onTouch(final View v, final MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_UP) { final long now = System.currentTimeMillis(); lastTouchTime = now; touchCount.incrementAndGet(); //每點擊一次就移除上一次的延遲任務,重新布置一個延遲任務 removeCallback(); mRun = new Runnable() { @Override public void run() {
//兩個變量相等,表示時隔 multiTouchInterval之后沒有新的touch產生, 觸發事件並重置touchCount if (now == lastTouchTime) { onMultiTouch(v, event, touchCount.get()); touchCount.set(0); } } }; postTaskInUIThread(mRun, getMultiTouchInterval()); } return true; } /** * 連續touch的最大間隔, 超過該間隔將視為一次新的touch開始, 默認是400,推薦值,也可以由客戶代碼指定 * * @return */ protected int getMultiTouchInterval() { return 400; } /** * 連續點擊事件回調 * * @param v * @param event * @param touchCount * 連續點擊的次數 * @return */ public abstract void onMultiTouch(View v, MotionEvent event, int touchCount); }
使用代碼:
mView.setOnTouchListener( new OnMultiTouchListener() { @Override public void onMultiTouch(View v, MotionEvent event, int touchCount) { if (touchCount == 2) { //雙擊 } } });
簡潔直接的方法是用GestureDector類:
mView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { GestureDetector detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { @Override public boolean onSingleTapUp(MotionEvent e) { return super.onSingleTapUp(e); } @Override public void onLongPress(MotionEvent e) { super.onLongPress(e); } @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return super.onScroll(e1, e2, distanceX, distanceY); } @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return super.onFling(e1, e2, velocityX, velocityY); } @Override public void onShowPress(MotionEvent e) { super.onShowPress(e); } @Override public boolean onDown(MotionEvent e) { return super.onDown(e); } @Override public boolean onDoubleTap(MotionEvent e) { return super.onDoubleTap(e); } @Override public boolean onDoubleTapEvent(MotionEvent e) { return super.onDoubleTapEvent(e); } @Override public boolean onSingleTapConfirmed(MotionEvent e) { return super.onSingleTapConfirmed(e); } @Override public boolean onContextClick(MotionEvent e) { return super.onContextClick(e); } }); detector.onTouchEvent(event); return false; } });