首页 > 代码库 > 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会被认为是一次双击。