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

Android实现双击事件的两种方式的更多相关文章

  1. nodejs触发事件的两种方式

    nodejs触发事件的两种方式: 方式之一:通过实例化events.EventEmitter //引入events模块 var events = require('events'); //初始化eve ...

  2. android点击事件的四种方式

    android点击事件的四种方式 第一种方式:创建内部类实现点击事件 代码如下: package com.example.dail; import android.text.TextUtils; im ...

  3. Cocos2d-x 处理双击事件的两种方法

    在cocos2d-x的开发过程中有些时候也是需要用到双击的事件处理,那么由于在cocos2d-x中没有实现对双击的事件的处理,那么我们就需要自己用代码实现. 下面介绍两种方式实现双击事件的处理. (一 ...

  4. Xamarin Android Activity全屏的两种方式

    方式一 直接在Activity的Attribute中定义 如下 在 MainActivity 中 [Activity(Label = "app", MainLauncher = t ...

  5. 阻止事件冒泡两种方式:event.stopPropagation();和return false;

    jQuery提供了两种方式来阻止事件冒泡. 方式一:event.stopPropagation(); $("#div1").mousedown(function (event) { ...

  6. Android Studio签名打包的两种方式

    签名打包的两种方式: 注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如 ...

  7. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  8. Javascript绑定事件的两种方式的区别

    命名函数 <input type="button" onclick="check()" id="btn"/> <scrip ...

  9. (原创)android中使用相机的两种方式

    在社交类应用或扫描二维码的场合都需要用到手机上的摄像头 在程序中启用这一硬件主要有两类方法 1.发送intent启动系统自带的摄像应用 此应用的AndroidManifest中的intent-filt ...

随机推荐

  1. [LeetCode] Ransom Note 赎金条

    
Given
 an 
arbitrary
 ransom
 note
 string 
and 
another 
string 
containing 
letters from
 all 
th ...

  2. HFSS仿真小例

    微带拐角对比实验 微带四分之波长变换器插入前后对比 P1 P2 分配波端口激励,设置差分信号线 微带线差分对的差模阻抗随着差分线间距的增大而增大,随着线宽的增大而减小: 共模阻抗随着差分线间距的增大而 ...

  3. 【原】Learning Spark (Python版) 学习笔记(三)----工作原理、调优与Spark SQL

    周末的任务是更新Learning Spark系列第三篇,以为自己写不完了,但为了改正拖延症,还是得完成给自己定的任务啊 = =.这三章主要讲Spark的运行过程(本地+集群),性能调优以及Spark ...

  4. CDQ分治

    要求可以计算前面的操作对后面询问的贡献 BZOJ1176 #include <cstdio> #include <algorithm> using namespace std; ...

  5. 比较.NET程序集(DLL或EXE)是否相同

    如何比较两个.NET程序集(DLL或EXE)是否相同呢? 直接比较文件内容?当然没那么简单了,这个你可以去试试,去比较一下两次Build产生的程序集, 就算内容没有改变,产生的程序集的二进制文件也是不 ...

  6. Android疑难杂症收集

    在渲染前获取 View 的宽高 5种手势工具类 软键盘用法总结 Android中Shape的使用 Android只能动态注册的广播Action Android 悬浮窗权限各机型各系统适配大全 录音权限 ...

  7. 【IT】公司FTP服务器使用说明

    FTP服务器的作用:----------------------------------------------1.员工个人或者部门资料临时备份(而不是永久归档): 2.部门或员工间交换巨大资料: 3 ...

  8. css学习笔记(1)

    为什么要重新学css,理由有很多,css这个小婊砸,接触至今已有三年,但真的说熟练恐怕不见得.特此,为了我的目标,开始重新整理css的知识,我希望,每一篇笔记都能有个例子,从而来巩固我的知识. 在学习 ...

  9. Android基础总结(十)

    内容提供者(掌握) 应用的数据库是不允许其他应用访问的 内容提供者的作用就是让别的应用访问到你的私有数据 自定义内容提供者,继承ContentProvider类,重写增删改查方法,在方法中写增删改查数 ...

  10. MySQL备忘

    Access denied for user 'root'@'localhost' >> 执行以下语句 GRANT ALL ON dbname.* TO 'root'@'localhost ...