博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Android 使用 OnTouchListener 接口监听双击或多击事件

Posted on 2013-07-09 17:24  [虫子]  阅读(3302)  评论(0编辑  收藏  举报

这里是使用 OnTouchListener 实现的监听双击 or 多击的监听器。通过 View.setOnTouchListener ,可以实现在任意 View 上监听双击事件。

网上有许多文章简单的使用 OnTouchListener + 计数器自增 的方法实现,但该方法有个严重的弊端:连续三击会被当作一次双击和一次单机;连续四击会被当作两次双击,………… 原因就是无法分辨多次单击是连续的。

下面是一个完整的实现,可以监听多击,且知道次数。

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);
}