213 final int action = ev.getAction();
214 final float y = ev.getY();
215 final float x = ev.getX();
217 boolean handled =
false;
219 switch (action & MotionEvent.ACTION_MASK)
221 case MotionEvent.ACTION_POINTER_DOWN:
222 if (mIgnoreMultitouch)
229 case MotionEvent.ACTION_POINTER_UP:
231 if (mIgnoreMultitouch && ev.getPointerCount() == 2)
233 int index = (((action & MotionEvent.ACTION_POINTER_INDEX_MASK) >>
234 MotionEvent.ACTION_POINTER_INDEX_SHIFT) == 0)
237 mLastMotionX = ev.getX(index);
238 mLastMotionY = ev.getY(index);
242 case MotionEvent.ACTION_DOWN:
243 if (mDoubleTapListener !=
null)
245 boolean hadTapMessage = mHandler.hasMessages(TAP);
247 mHandler.removeMessages(TAP);
248 if ((mCurrentDownEvent !=
null) && (mPreviousUpEvent !=
null) &&
250 isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev))
253 mIsDoubleTapping =
true;
255 handled |= mDoubleTapListener.
onDoubleTap(mCurrentDownEvent);
262 mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
268 if (mCurrentDownEvent !=
null)
270 mCurrentDownEvent.recycle();
272 mCurrentDownEvent = MotionEvent.obtain(ev);
273 mAlwaysInTapRegion =
true;
274 mAlwaysInBiggerTapRegion =
true;
276 mInLongPress =
false;
278 if (mIsLongpressEnabled)
280 mHandler.removeMessages(LONG_PRESS);
281 mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime() +
285 mHandler.sendEmptyMessageAtTime(SHOW_PRESS,
286 mCurrentDownEvent.getDownTime() + TAP_TIMEOUT);
287 handled |= mListener.
onDown(ev);
290 case MotionEvent.ACTION_MOVE:
291 if (mIgnoreMultitouch && ev.getPointerCount() > 1)
295 final float scrollX = mLastMotionX - x;
296 final float scrollY = mLastMotionY - y;
297 if (mIsDoubleTapping)
302 else if (mAlwaysInTapRegion)
304 final int deltaX = (int)(x - mCurrentDownEvent.getX());
305 final int deltaY = (int)(y - mCurrentDownEvent.getY());
306 int distance = (deltaX * deltaX) + (deltaY * deltaY);
307 if (distance > mTouchSlopSquare)
311 mAlwaysInTapRegion =
false;
312 mHandler.removeMessages(TAP);
313 mHandler.removeMessages(SHOW_PRESS);
314 mHandler.removeMessages(LONG_PRESS);
316 if (distance > mLargeTouchSlopSquare)
318 mAlwaysInBiggerTapRegion =
false;
320 handled = mListener.
onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
322 else if ((Math.abs(scrollX) >= 1) || (Math.abs(scrollY) >= 1))
324 handled = mListener.
onScroll(mCurrentDownEvent, ev, scrollX, scrollY);
330 case MotionEvent.ACTION_UP:
332 MotionEvent currentUpEvent = MotionEvent.obtain(ev);
333 if (mIsDoubleTapping)
338 else if (mInLongPress)
340 mHandler.removeMessages(TAP);
342 mInLongPress =
false;
344 else if (mAlwaysInTapRegion)
352 if (mPreviousUpEvent !=
null)
354 mPreviousUpEvent.recycle();
357 mPreviousUpEvent = currentUpEvent;
358 mIsDoubleTapping =
false;
359 mHandler.removeMessages(SHOW_PRESS);
360 mHandler.removeMessages(LONG_PRESS);
361 handled |= mListener.
onUp(ev);
363 case MotionEvent.ACTION_CANCEL: