android中根据touch事件判断单击及双击

  1. private static final int MAX_INTERVAL_FOR_CLICK = 250;  
  2.     private static final int MAX_DISTANCE_FOR_CLICK = 100;  
  3.     private static final int MAX_DOUBLE_CLICK_INTERVAL = 500;  
  4.     int mDownX = 0;  
  5.     int mDownY = 0;  
  6.     int mTempX = 0;  
  7.     int mTempY = 0;  
  8.     boolean mIsWaitUpEvent = false;  
  9.     boolean mIsWaitDoubleClick = false;  
  10.     Runnable mTimerForUpEvent = new Runnable() {  
  11.         public void run() {  
  12.             if (mIsWaitUpEvent) {  
  13.                 Log.d(LOG_TAG,  
  14.                         "The mTimerForUpEvent has executed, so set the mIsWaitUpEvent as false");  
  15.                 mIsWaitUpEvent = false;  
  16.             } else {  
  17.                 Log.d(LOG_TAG,  
  18.                         "The mTimerForUpEvent has executed, mIsWaitUpEvent is false,so do nothing");  
  19.             }  
  20.         }  
  21.     };  
  22.   
  23.   
  24.     @Override  
  25.     public boolean onTouchEvent(MotionEvent event) {  
  26.         if (!mIsWaitUpEvent && event.getAction() != MotionEvent.ACTION_DOWN) {  
  27.             return super.onTouchEvent(event);  
  28.         }  
  29.         switch (event.getAction()) {  
  30.         case MotionEvent.ACTION_DOWN:  
  31.             mDownX = (int) event.getX();  
  32.             mDownY = (int) event.getY();  
  33.             mIsWaitUpEvent = true;  
  34.             postDelayed(mTimerForUpEvent, MAX_INTERVAL_FOR_CLICK);  
  35.             break;  
  36.         case MotionEvent.ACTION_MOVE:  
  37.             mTempX = (int) event.getX();  
  38.             mTempY = (int) event.getY();  
  39.             if (Math.abs(mTempX - mDownX) > MAX_DISTANCE_FOR_CLICK  
  40.                     || Math.abs(mTempY - mDownY) > MAX_DISTANCE_FOR_CLICK) {  
  41.                 mIsWaitUpEvent = false;  
  42.                 removeCallbacks(mTimerForUpEvent);  
  43.                 Log.d(LOG_TAG, "The move distance too far:cancel the click");  
  44.             }  
  45.             break;  
  46.         case MotionEvent.ACTION_UP:  
  47.             mTempX = (int) event.getX();  
  48.             mTempY = (int) event.getY();  
  49.             if (Math.abs(mTempX - mDownX) > MAX_DISTANCE_FOR_CLICK  
  50.                     || Math.abs(mTempY - mDownY) > MAX_DISTANCE_FOR_CLICK) {  
  51.                 mIsWaitUpEvent = false;  
  52.                 removeCallbacks(mTimerForUpEvent);  
  53.                 Log.d(LOG_TAG,  
  54.                         "The touch down and up distance too far:cancel the click");  
  55.                 break;  
  56.             } else {  
  57.                 mIsWaitUpEvent = false;  
  58.                 removeCallbacks(mTimerForUpEvent);  
  59.                 onSingleClick();  
  60.                 return super.onTouchEvent(event);  
  61.             }  
  62.         case MotionEvent.ACTION_CANCEL:  
  63.             mIsWaitUpEvent = false;  
  64.             removeCallbacks(mTimerForUpEvent);  
  65.             Log.d(LOG_TAG, "The touch cancel state:cancel the click");  
  66.             break;  
  67.         default:  
  68.             Log.d(LOG_TAG, "irrelevant MotionEvent state:" + event.getAction());  
  69.         }  
  70.         return super.onTouchEvent(event);  
  71.     }  
  72.   
  73.   
  74.     Runnable mTimerForSecondClick = new Runnable() {  
  75.         @Override  
  76.         public void run() {  
  77.             if (mIsWaitDoubleClick) {  
  78.                 Log.d(LOG_TAG,  
  79.                         "The mTimerForSecondClick has executed,so as a singleClick");  
  80.                 mIsWaitDoubleClick = false;  
  81.                 // at here can do something for singleClick!!  
  82.             } else {  
  83.                 Log.d(LOG_TAG,  
  84.                         "The mTimerForSecondClick has executed, the doubleclick has executed ,so do thing");  
  85.             }  
  86.         }  
  87.     };  
  88.   
  89.     public void onSingleClick() {  
  90.         if (mIsWaitDoubleClick) {  
  91.             onDoubleClick();  
  92.             mIsWaitDoubleClick = false;  
  93.             removeCallbacks(mTimerForSecondClick);  
  94.         } else {  
  95.             mIsWaitDoubleClick = true;  
  96.             postDelayed(mTimerForSecondClick, MAX_DOUBLE_CLICK_INTERVAL);  
  97.         }  
  98.     }  
  99.   
  100.     public void onDoubleClick() {  
  101.         Log.d(LOG_TAG,"we can do sth for double click here");  
  102.     }  

猜你喜欢

转载自blog.csdn.net/guankai1990/article/details/79407966