/** * galaxy inc. * meetup client for android */ package com.galaxy.meetup.client.android.ui.view; import android.content.Context; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; /** * * @author sihai * */ public class TwoPointerGestureDetector extends SimpleOnGestureListener implements OnTouchListener { private long mEndTime; private final GestureDetector mGestureDetector; private android.view.MotionEvent.PointerCoords mPointerEnd[]; private android.view.MotionEvent.PointerCoords mPointerStart[]; private long mStartTime; private TwoPointerSwipeState mTwoSwipeState; public TwoPointerGestureDetector(Context context) { mTwoSwipeState = TwoPointerSwipeState.INITIAL; android.view.MotionEvent.PointerCoords apointercoords[] = new android.view.MotionEvent.PointerCoords[2]; apointercoords[0] = new android.view.MotionEvent.PointerCoords(); apointercoords[1] = new android.view.MotionEvent.PointerCoords(); mPointerStart = apointercoords; android.view.MotionEvent.PointerCoords apointercoords1[] = new android.view.MotionEvent.PointerCoords[2]; apointercoords1[0] = new android.view.MotionEvent.PointerCoords(); apointercoords1[1] = new android.view.MotionEvent.PointerCoords(); mPointerEnd = apointercoords1; mGestureDetector = new GestureDetector(context, this); } private static boolean verifyPointerDistance(android.view.MotionEvent.PointerCoords apointercoords[]) { boolean flag = true; float f = Math.abs(apointercoords[0].x - apointercoords[1].x); float f1 = Math.abs(apointercoords[0].y - apointercoords[1].y); if(f > 100F || f1 > 250F) flag = false; return flag; } public boolean onDown(MotionEvent motionevent) { return true; } public boolean onTouch(View view, MotionEvent motionevent) { int i = motionevent.getActionMasked(); int j = motionevent.getPointerCount(); switch(mTwoSwipeState) { case INITIAL: if(i == 0 && j == 1) mTwoSwipeState = TwoPointerSwipeState.ONE_DOWN; break; case ONE_DOWN: if(i == 5) { if(j == 2) { mTwoSwipeState = TwoPointerSwipeState.TWO_DOWN; motionevent.getPointerCoords(0, mPointerStart[0]); motionevent.getPointerCoords(1, mPointerStart[1]); mStartTime = motionevent.getEventTime(); if(verifyPointerDistance(mPointerStart)) mTwoSwipeState = TwoPointerSwipeState.TWO_DOWN; else mTwoSwipeState = TwoPointerSwipeState.INITIAL; } else { mTwoSwipeState = TwoPointerSwipeState.INITIAL; } } else if(i == 1 || i == 6) mTwoSwipeState = TwoPointerSwipeState.INITIAL; break; case TWO_DOWN: if(j != 2) mTwoSwipeState = TwoPointerSwipeState.INITIAL; else if(i == 6) { motionevent.getPointerCoords(0, mPointerEnd[0]); motionevent.getPointerCoords(1, mPointerEnd[1]); mEndTime = motionevent.getEventTime(); if(verifyPointerDistance(mPointerEnd)) mTwoSwipeState = TwoPointerSwipeState.ONE_UP; else mTwoSwipeState = TwoPointerSwipeState.INITIAL; } break; case ONE_UP: if(j != 1) mTwoSwipeState = TwoPointerSwipeState.INITIAL; else if(i == 5 || i == 0) mTwoSwipeState = TwoPointerSwipeState.INITIAL; else if(i == 1) if(motionevent.getEventTime() - mEndTime > 100L) { mTwoSwipeState = TwoPointerSwipeState.INITIAL; } else { mTwoSwipeState = TwoPointerSwipeState.INITIAL; long l = mEndTime - mStartTime; if(l > 0L && l <= 500L) { float f = (1000F * (mPointerEnd[0].x - mPointerStart[0].x)) / (float)l; float f1 = (1000F * (mPointerEnd[0].y - mPointerStart[0].y)) / (float)l; onTwoPointerSwipe(mPointerStart[0], mPointerEnd[0], f, f1); } } break; default: break; } return mGestureDetector.onTouchEvent(motionevent); } public boolean onTwoPointerSwipe(android.view.MotionEvent.PointerCoords pointercoords, android.view.MotionEvent.PointerCoords pointercoords1, float f, float f1) { return true; } //================================================================================================================== // Inner class //================================================================================================================== private static enum TwoPointerSwipeState { INITIAL, ONE_DOWN, TWO_DOWN, ONE_UP; } }