這裏是使用 OnTouchListener 實現的監聽雙擊 or 多擊的監聽器。經過 View.setOnTouchListener ,能夠實如今任意 View 上監聽雙擊事件。java
網上有許多文章簡單的使用 OnTouchListener + 計數器自增 的方法實現,但該方法有個嚴重的弊端:連續三擊會被看成一次雙擊和一次單機;連續四擊會被看成兩次雙擊,………… 緣由就是沒法分辨屢次單擊是連續的。android
下面是一個完整的實現,能夠監聽多擊,且知道次數。ide
import android.os.Handler; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; public abstract class MultiTouchListener implements OnTouchListener { // 連續 touch 的最大間隔, 超過該間隔將視爲一次新的 touch 開始 private long multiTouchInterval; // 上次 onTouch 發生的時間 private long lastTouchTime; // 已經連續 touch 的次數 private int touchCount; public MultiTouchListener() { this(250); } public MultiTouchListener(long multiTouchInterval) { this.multiTouchInterval = multiTouchInterval; this.lastTouchTime = 0; this.touchCount = 0; } @Override public boolean onTouch(final View v, final MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_DOWN) { final long now = System.currentTimeMillis(); this.lastTouchTime = now; synchronized(this) { this.touchCount ++; } new Handler().postDelayed(new Runnable() { @Override public void run() { // 兩個變量相等, 表示時隔 multiTouchInterval 以後沒有新的 touch 產生, 觸發事件並重置 touchCount if(now == MultiTouchListener.this.lastTouchTime) { synchronized (MultiTouchListener.this) { MultiTouchListener.this.onMultiTouch(v, event, MultiTouchListener.this.touchCount); MultiTouchListener.this.touchCount = 0; } } } }, MultiTouchListener.this.multiTouchInterval); } return true; } public abstract boolean onMultiTouch(View v, MotionEvent event, int touchCount); }