zoukankan      html  css  js  c++  java
  • 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类实现
    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会被认为是一次双击。

  • 相关阅读:
    关于JQ中,新生成的节点on绑定事件失效的解决
    免费获取SSL证书/一键安装SSL证书/https加密
    在github上面创建新的分支
    github-新建文件夹
    如何删除github上的某个文件夹
    FTP连接虚拟主机响应220 Welcome to www.net.cn FTP service. (解决的一个问题)
    两种方法上传本地文件到github(转)
    Windows下如何将一个文件夹通过Git上传到GitHub上(转)
    利用Github免费搭建个人主页(转)
    关于阿里ICON矢量图(SVG)上传问题.
  • 原文地址:https://www.cnblogs.com/zj2012zy/p/3774628.html
Copyright © 2011-2022 走看看