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 ...
随机推荐
- flyway 非常坑爹的中文乱码问题
flyway 也真是够了, 动不动乱码,烦死了! 我的 命令是这样的: flyway -driver=com.mysql.jdbc.Driver -user=root -password=12345 ...
- c语言从入门到精通的几个阶段
本文主要结合往期学员学习阶段,因材施教整理的几个阶段学习路线知识点: 1.初级教程 初级c语言入门教程比较适合零基础的小白,这个周期一般在22天,度过这个阶段的小白,基本上已经拥有了编程思维,且能开发 ...
- dpwwn: 1 Vulnhub Walkthrough
主机层面扫描: ╰─ nmap -p1-65535 -sV -A 10.10.202.130 22/tcp open ssh OpenSSH 7.4 (protocol 2.0) 80/ ...
- 45.QT-连接外部dll,lib库导入问题
dll库问题 查看MZ_Card.dll对应的文档手册,如下图所示: 所以代码写为: typedef BOOL (*Fun)(BOOL IsOpenComm,unsigned long Port, u ...
- 速查 objc中可变集合和不可变集合的遍历性能
次数 : 5,000,000 NSMutableArray //0.131999/0.116085/0.112128 NSArray //0.116842/0.111675/0.108623 NSMu ...
- Tornado 框架
Tronado为何物 Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器兼Web应用框架,由FriendFeed公司在自己的网站FriendFeed中使 ...
- LeetCode刷题191121
博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 数据库: 编写一个 SQL 查询,来删除 Person 表中所有重复的电 ...
- CentOS连接Wifi
原文地址:https://blog.csdn.net/zhuangm_888/article/details/53868451 1. 查看是否需要安装固件 大多无线网卡还需要固件.内核一般会自动探 ...
- GTID复制的工作原理
参考自:https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-lifecycle.html 笔记说明: 本文翻译自官网,当然会根据语义做一 ...
- 如何使用python远程操作linux
在云服务测试中,往往需要我们进入云服务内容进行相关内容的测试.这测试可以使用平台自身的noVNC.外部辅助xshell等工具连接到云服务内部进行测试.但是在如此反复的测试操作中,就需要用到自动化测试方 ...