需求:viewpager显示图片,需要在双击时对图片进行缩放,单击时在屏幕下方弹出popwindow,由于android的双击本质就是两次单击,但是又不想在双击时触发单击时的动作,所以就在网上各种搜解决办法,未果,经过苦思冥想,发现以下办法

1.重写activity的dispatchTouchEvent方法

 1 @Override 2     public boolean dispatchTouchEvent(MotionEvent event) { 3  4         if (event.getAction() == MotionEvent.ACTION_DOWN) { 5             mDownX = (int) event.getX(); 6             if (mFirstTouchEventTime == 0) { 7                 mFirstTouchEventTime = event.getDownTime(); 8             } else { 9                 mLastTouchEventTime = event.getDownTime();10             }11         } else if (event.getAction() == MotionEvent.ACTION_UP) {12             mUpX = (int) event.getX();13             if (Math.abs(mUpX - mDownX) < 30) {14                 Log.d(TAG, "--->>" + Math.abs(mFirstTouchEventTime - mLastTouchEventTime));15                 if (Math.abs(mFirstTouchEventTime - mLastTouchEventTime) < Constants.TIME_MENU_DISPLAY) {16                     mFirstTouchEventTime = 0L;17                     mLastTouchEventTime = 0L;18                     mScreenObsever.removeMessages(Constants.MSG_MENU_DISPLAY);19                 } else {20                     mScreenObsever.sendEmptyMessageDelayed(Constants.MSG_MENU_DISPLAY, Constants.TIME_MENU_DISPLAY);21                 }22             } else {23                 mFirstTouchEventTime = 0L;24                 mLastTouchEventTime = 0L;25             }26         }27 28         return super.dispatchTouchEvent(event);29     }
其中 mFirstTouchEventTime 与 mLastTouchEventTime 为两个long型类变量,用来记录两次ACTION_DOWN动作发生的时间,Constants.TIME_MENU_DISPLAY 为一个自定义的msg what。mScreenObserver为一个自定义的handler,用来处理单击事件用。
2.mScreenObserver 的handler类实现
private class ObseverOperateHandler extends Handler {@Overridepublic 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. Android音频播放
  2. android studio 删除、导入jar包
  3. Android本地广播动作
  4. Android(安卓)应用程序签名、发布
  5. Android(安卓)常用控件接口监听
  6. Flutter在Android(安卓)Studio上的初启动
  7. 我的第一个Android程序helloword及个人理解
  8. android 中定时器的几种写法
  9. Android(安卓)Intent的用法总结

随机推荐

  1. 如何在Nokia-x中获得广告ID ?
  2. 在活动中管理多个asynctask什么显示数据(S
  3. 如何在函数中将两个参数从1个类传递给另
  4. kotlin-stdlib-jre7已弃用。请改用kotlin
  5. android BluetoothAdapter蓝牙BLE扫描总
  6. AutoCompleteTextView 设置了点击事件需
  7. 导航架构组件 - 具有CollapsingToolbar的
  8. android中判断一个点是否在一个封闭Path
  9. 如何在Python中将Google帐户身份验证添加
  10. Google Play服务API(位置服务)是否需要数据