Work around的方法是先监听onTouch事件来监听连续点击次数,每次点击都布置一个间隔时间的延时任务,延时任务执行时判断间隔内是否还有点击,如果没有则发布点击次数,重置计数。

实现代码如下:

/**
* 连续点击事件监听器 可以用作双击事件
*
*/
public abstract class OnMultiTouchListener implements OnTouchListener {
/**
* 上次 onTouch 发生的时间
*/
private long lastTouchTime = 0;
/**
* 已经连续 touch 的次数
*/
private AtomicInteger touchCount = new AtomicInteger(0); private Runnable mRun = null; public void removeCallback() {
if (mRun != null) {
       getMainLoopHandler().removeCallbacks(mRun);
mRun = null;
}
} @Override
public boolean onTouch(final View v, final MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_UP) {
final long now = System.currentTimeMillis();
lastTouchTime = now; touchCount.incrementAndGet();
       //每点击一次就移除上一次的延迟任务,重新布置一个延迟任务
removeCallback(); mRun = new Runnable() {
@Override
public void run() {
            //两个变量相等,表示时隔 multiTouchInterval之后没有新的touch产生, 触发事件并重置touchCount
if (now == lastTouchTime) {
onMultiTouch(v, event, touchCount.get());
touchCount.set(0);
}
}
}; postTaskInUIThread(mRun, getMultiTouchInterval());
}
return true;
} /**
* 连续touch的最大间隔, 超过该间隔将视为一次新的touch开始, 默认是400,推荐值,也可以由客户代码指定
*
* @return
*/
protected int getMultiTouchInterval() {
return 400;
} /**
* 连续点击事件回调
*
* @param v
* @param event
* @param touchCount
* 连续点击的次数
* @return
*/
public abstract void onMultiTouch(View v, MotionEvent event, int touchCount);
}

使用代码:

mView.setOnTouchListener( new OnMultiTouchListener() {
@Override
public void onMultiTouch(View v, MotionEvent event, int touchCount) {
if (touchCount == 2) {
//双击
}
}
});

简洁直接的方法是用GestureDector类:

mView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) { GestureDetector detector = new GestureDetector(getContext(), new GestureDetector.SimpleOnGestureListener() { @Override
public boolean onSingleTapUp(MotionEvent e) {
return super.onSingleTapUp(e);
} @Override
public void onLongPress(MotionEvent e) {
super.onLongPress(e);
} @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return super.onScroll(e1, e2, distanceX, distanceY);
} @Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return super.onFling(e1, e2, velocityX, velocityY);
} @Override
public void onShowPress(MotionEvent e) {
super.onShowPress(e);
} @Override
public boolean onDown(MotionEvent e) {
return super.onDown(e);
} @Override
public boolean onDoubleTap(MotionEvent e) {
return super.onDoubleTap(e);
} @Override
public boolean onDoubleTapEvent(MotionEvent e) {
return super.onDoubleTapEvent(e);
} @Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return super.onSingleTapConfirmed(e);
} @Override
public boolean onContextClick(MotionEvent e) {
return super.onContextClick(e);
}
});
detector.onTouchEvent(event); return false;
}
});

最新文章

  1. Java学习-020-Properties 判断是否存在对应的 key 项
  2. HTML+CSS编写规范
  3. poj----(1470)Closest Common Ancestors(LCA)
  4. SWFUpload接受服务器Action返回的参数
  5. Cocos2d-x实例:设置背景音乐与音效- AppDelegate实现
  6. Java [leetcode 15] 3Sum
  7. ANDROID_MARS学习笔记_S02重置版_001_Hander\Looper\Message\Thread\ThreadLocal
  8. linux中切换用户方式su和su -的区别
  9. Android Studio中获取sha1证书指纹数据的方法
  10. C#_C++_SDK_WM_KEYDOWN人物卡顿延迟解决方法
  11. 关于s2sh框架关于hibernate懒加载问题的说明和解决方案
  12. Core Animation 文档翻译 (第六篇)
  13. iOS开发,改变系统铃声音量和静音,并非媒体播放音量
  14. 执行sql语句为什么?用PreparedStatement要比Statement好用
  15. folder,source folder,package 区别
  16. windows下使用RedisCluster集群简单实例
  17. 命令查询职责分离(CQRS)模式
  18. linux mint19.1解决网易云音乐安装后打不开的问题
  19. nyoj 740 “炫舞家“ST
  20. 第一百三十七节,JavaScript,封装库---修缮拖拽

热门文章

  1. [LeetCode] Zigzag Iterator 之字形迭代器
  2. [LeetCode] Consecutive Numbers 连续的数字
  3. C#代码中实现两个表(DataTable)的关联查询(JOIN)
  4. WebAPI中无法获取Session对象的解决办法
  5. DeepMind背后的人工智能:深度学习原理初探
  6. haproxy利用ACL规则封禁自定义IP地址拒绝访问
  7. MySQL练习题参考答案
  8. lua命令行编译
  9. Java的修饰符
  10. hibernate- Hibernate中多对多的annotation的写法(中间表可以有多个字段)