需求: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会被认为是一次双击。

最新文章

  1. myeclipse中Web App Libraries无法自动识别lib下的jar包
  2. 【转】Xcode 6制作动态及静态Framework
  3. 分析SIX锁和锁分区导致的死锁
  4. DevExpress某些控件继承后的可编辑性
  5. Netmask v. Address Prefix Length
  6. basic mongodb
  7. Qt读取ANSI格式文件——利用QTextCodec将其他编码格式的QByteArray转换为Unicode格式,或者从文件中读出后直接做转换
  8. C++智能指针--weak_ptr
  9. SE 2014年5月25日
  10. VUE2.0实现购物车和地址选配功能学习第四节
  11. (转)微信禁用右上角的分享按钮,WeixinJSBridge API以及隐藏分享的子按钮等菜单项
  12. 1.0 添加WEB API项目并按注释生成文档(多项目结构)
  13. 工厂模式讲解, 引入Spring IOC
  14. CentOS6.5 - linux在虚拟机连接主机(使用nat)
  15. Java中Enumeration接口的用法
  16. C++11 constexpr使用
  17. HDU 3943 数位dp+二分
  18. Springboot简介01
  19. java总结(二)(运算符)
  20. ios野指针的3种常见情况

热门文章

  1. WebRTC分支提交记录
  2. C# sync/async 同步/异步
  3. IT兄弟连 HTML5教程 CSS3属性特效 圆角
  4. Java题库——Chapter16 JavaFX UI组件和多媒体
  5. docker chromium/chrome: error while loading shared libraries: libXcursor.so.2: cannot open shared object file: No such file or directory
  6. JavaScript定时器(Timer)
  7. 当Python遇上AI(一)
  8. MS16-072域内中间人攻击
  9. 头条小视频和西瓜视频signature签名算法
  10. AndroidStudio3.0升级成3.5后之前项目报错解决