这里是使用 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);
}
|