首页 > 代码库 > android 完全区分double-tap 与 singal-tap 的方法
android 完全区分double-tap 与 singal-tap 的方法
需求: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类实现
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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会被认为是一次双击。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。