android 完全区分double-tap 与 singal-tap 的方法
需求:viewpager显示图片,需要在双击时对图片进行缩放,单击时在屏幕下方弹出popwindow,由于android的双击本质就是两次单击,但是又不想在双击时触发单击时的动作,所以就在网上各种搜解决办法,未果,经过苦思冥想,发现以下办法
1.重写activity的dispatchTouchEvent方法
@Override
public boolean dispatchTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) {
mDownX = (int) event.getX();
if (mFirstTouchEventTime == 0) {
mFirstTouchEventTime = event.getDownTime();
} else {
mLastTouchEventTime = event.getDownTime();
}
} else if (event.getAction() == MotionEvent.ACTION_UP) {
mUpX = (int) event.getX();
if (Math.abs(mUpX - mDownX) < 30) {
Log.d(TAG, "--->>" + Math.abs(mFirstTouchEventTime - mLastTouchEventTime));
if (Math.abs(mFirstTouchEventTime - mLastTouchEventTime) < Constants.TIME_MENU_DISPLAY) {
mFirstTouchEventTime = 0L;
mLastTouchEventTime = 0L;
mScreenObsever.removeMessages(Constants.MSG_MENU_DISPLAY);
} else {
mScreenObsever.sendEmptyMessageDelayed(Constants.MSG_MENU_DISPLAY, Constants.TIME_MENU_DISPLAY);
}
} else {
mFirstTouchEventTime = 0L;
mLastTouchEventTime = 0L;
}
} return super.dispatchTouchEvent(event);
}
其中 mFirstTouchEventTime 与 mLastTouchEventTime 为两个long型类变量,用来记录两次ACTION_DOWN动作发生的时间,Constants.TIME_MENU_DISPLAY 为一个自定义的msg what。mScreenObserver为一个自定义的handler,用来处理单击事件用。
2.mScreenObserver 的handler类实现
private class ObseverOperateHandler extends Handler {
@Override
public void handleMessage(Message msg) {
if (msg.what == Constants.MSG_MENU_DISPLAY) {
mFirstTouchEventTime = 0L;
mLastTouchEventTime = 0L;
if (mOperateMenuPopupWindow.isShowing()) {
mNotePopWindow.startDownAnimation();
mOperateMenuPopupWindow.dismiss();
} else {
mNotePopWindow.startUpAnimation();
mOperateMenuPopupWindow.showAtLocation(findViewById(R.id.photoLayout), Gravity.BOTTOM, 0, 0);
}
}
super.handleMessage(msg);
}
}
if 中的部分即是要在单击中处理的事情了
3.至于双击要做的事情,就可以正常实现GestureDetector.OnDoubleTapListener来处理了。网上就可以搜到怎么弄了。
另外代码中的Constants.TIME_MENU_DISPLAY这个时间值,经各种途径验证为350ms比较恰当,即两次单击间隔350ms会被认为是一次双击。
android 完全区分double-tap 与 singal-tap 的方法的更多相关文章
- zepto学习(二)之tap事件以及tap事件点透处理
前言 为什么通过touch可以触发click事件? touch事件的来源 PC网页上的大部分操作都是用鼠标的,即响应的是鼠标事件,包括mousedown.mouseup.mousemove和click ...
- 关于 android 的setOnItemClickListener 和 setOnItemLongClickListener 同时触发的解决方法
关于 android 的setOnItemClickListener 和 setOnItemLongClickListener 同时触发的解决方法. 其实方法也是很简单 的主要 setOnItemLo ...
- Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法
http://www.cnblogs.com/SkyD/archive/2010/11/08/1871423.html Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法 Surfa ...
- android中退出当前应用程序的四种方法
android中退出当前应用程序的四种方法 [IT168 技术]Android程序有很多Activity,比如说主窗口A,调用了子窗口B,如果在B中直接finish(), 接下里显示的是A.在B中如何 ...
- Android中activity保存数据和状态在哪个方法实现
以前只知道在Activity销毁之前,要把数据保存在 onSaveInstanceState(Bundle)方法中,后来学习了别人的微博,学到了很多细节问题,所以整理了一下,希望能帮到大家. 如果看官 ...
- Xamarin for android:为button设置click事件的几种方法
原文:Xamarin for android:为button设置click事件的几种方法 在Xamarin中一个最基础的事情,就是为一个button指定click事件处理方法,可是即使是这么一件事也有 ...
- Android开发华为手机无法看log日志解决方法
Android开发华为手机无法看log日志解决方法 上班的时候,由于开发工具由Eclipse改成Android Studio后,原本的华为手机突然无法查看崩溃日志了,大家都知道,若是无法查看日志要它毛 ...
- Gradle 同步时报错,Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha8的解决方法
Error:Could not find com.android.support.constraint:constraint-layout:1.0.0-alpha8. 原因: SDK 中可能是没有安装 ...
- Android应用开发中三种常见的图片压缩方法
Android应用开发中三种常见的图片压缩方法,分别是:质量压缩法.比例压缩法(根据路径获取图片并压缩)和比例压缩法(根据Bitmap图片压缩). 一.质量压缩法 private Bitmap com ...
- 在Android开发中,定时执行任务的3种实现方法
在Android开发中,定时执行任务的3种实现方法: 一.采用Handler与线程的sleep(long)方法(不建议使用,Java的实现方式)二.采用Handler的postDelayed(Runn ...
随机推荐
- webpack动态加载打包chunk命名
最近,遇到复杂h5页面开发,为了优化H5首屏加载速度,想到使用按需加载的方式,减少首次加载的JavaScript文件体积,于是将处理过程在这里记录一下,涉及到的主要是以下三点: 使用Webpack如何 ...
- 小程序如何实现rem
最近在学习小程序,要把html的代码转换成小程序界面,其中就遇到了rem的转换问题,但小程序不太兼容rem,不是不能用rem,而是没办法设置根元素的font-size,因为rem是相对于根元素的fon ...
- JVM运行时数据区-详细结构图
- delphi使用Foxit Quick PDF Library读写pdf文本和图片
简介: Debenu Quick PDF Library(PDF编程开发工具)提供一套全方位的 PDF API 函数,帮助您快速简便地处理 PDF 文件.从文档属性的基本操作到创建您自己的 PDF 查 ...
- 在Electron中最快速预加载脚本
背景 在Electron打开新窗口的时候,提前加载一段JavaScript脚本,以此内置一些属性或接口给被打开的页面.之所以要以注入方式,而不是页面自己引用,原因是不想麻烦页面自行引用,不想修改旧有的 ...
- Windows添加自定义开机用户登录启动程序
默认的启动程序 Ctrl+shift -> Esc调用任务管理器-->启动项选项即可完成计算机开机自启动选项,不过这里只有系统默认添加的. 添加自定义开机启动程序 Windows+R调用运 ...
- 编译原理之DFA最小化,语法分析初步
1.将DFA最小化: 状态转换图: 识别语言:b*ac*(da)*bb* 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 (1)正规式: S -> 0(1S+ ...
- orm终极大爆炸
orm终极 甩一个代码给你 # 创建字段 class Field: def __init__(self, name, column_type, primary_key, default): self. ...
- SpringMVC自学笔记
1.<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 通过ser ...
- 《Web Development with Go》Middleware之使用codegangsta.negroni
这个第三方库,使用自定义中间件时, 语法就感觉流畅很多. package main import ( "fmt" "log" "net/http&qu ...