Android 使用 OnTouchListener 接口監聽雙擊或多擊事件

這裏是使用 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);
}
相關文章
相關標籤/搜索