android 完全区分double-tap 与 singal-tap 的方法
2024-09-01 00:43:37
需求: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会被认为是一次双击。
最新文章
- myeclipse中Web App Libraries无法自动识别lib下的jar包
- 【转】Xcode 6制作动态及静态Framework
- 分析SIX锁和锁分区导致的死锁
- DevExpress某些控件继承后的可编辑性
- Netmask v. Address Prefix Length
- basic mongodb
- Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换
- C++智能指针--weak_ptr
- SE 2014年5月25日
- VUE2.0实现购物车和地址选配功能学习第四节
- (转)微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
- 1.0 添加WEB API项目并按注释生成文档(多项目结构)
- 工厂模式讲解, 引入Spring IOC
- CentOS6.5 - linux在虚拟机连接主机(使用nat)
- Java中Enumeration接口的用法
- C++11 constexpr使用
- HDU 3943 数位dp+二分
- Springboot简介01
- java总结(二)(运算符)
- ios野指针的3种常见情况
热门文章
- WebRTC分支提交记录
- C# sync/async 同步/异步
- IT兄弟连 HTML5教程 CSS3属性特效 圆角
- Java题库——Chapter16 JavaFX UI组件和多媒体
- docker chromium/chrome: error while loading shared libraries: libXcursor.so.2: cannot open shared object file: No such file or directory
- JavaScript定时器(Timer)
- 当Python遇上AI(一)
- MS16-072域内中间人攻击
- 头条小视频和西瓜视频signature签名算法
- AndroidStudio3.0升级成3.5后之前项目报错解决