这里是使用 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);} |
本文介绍了一种使用OnTouchListener实现的多击监听器,能够准确地区分连续的单击事件,并记录点击次数。该监听器克服了传统实现中无法分辨连续点击的问题。
3920

被折叠的 条评论
为什么被折叠?



