Analyzes the given motion event and if applicable triggers the appropriate callbacks on the OnGestureListener
supplied.
103 {
104 boolean handled = false;
105 final int action = ev.getAction();
106
107
108 switch (action & MotionEvent.ACTION_MASK)
109 {
110 case MotionEvent.ACTION_DOWN:
111 if (mCurrentDownEvent != null)
112 mCurrentDownEvent.recycle();
113
114 mCurrentMode = MODE_UNKNOWN;
115 mCurrentDownEvent = MotionEvent.obtain(ev);
116 mCancelDetection = false;
117 mDoubleInProgress = false;
118 mScrollDetectionScore = 0;
119 handled = true;
120 break;
121
122 case MotionEvent.ACTION_POINTER_UP:
123 if (mPreviousPointerUpEvent != null)
124 mPreviousPointerUpEvent.recycle();
125 mPreviousPointerUpEvent = MotionEvent.obtain(ev);
126 break;
127
128 case MotionEvent.ACTION_POINTER_DOWN:
129
130
131 if (ev.getPointerCount() > 2 ||
132 (ev.getEventTime() - mCurrentDownEvent.getEventTime()) > DOUBLE_TOUCH_TIMEOUT)
133 {
134 cancel();
135 break;
136 }
137
138
139 if (mCancelDetection)
140 break;
141
142
143 mDoubleInProgress = true;
144 if (mCurrentDoubleDownEvent != null)
145 mCurrentDoubleDownEvent.recycle();
146 mCurrentDoubleDownEvent = MotionEvent.obtain(ev);
147
148
149
150 mCurrentMode = MODE_UNKNOWN;
151 mHandler.sendEmptyMessageDelayed(TAP, SINGLE_DOUBLE_TOUCH_TIMEOUT);
152
154 break;
155
156 case MotionEvent.ACTION_MOVE:
157
158
159 if (mCancelDetection || !mDoubleInProgress || ev.getPointerCount() != 2)
160 break;
161
162
163 if (mCurrentMode == MODE_UNKNOWN)
164 {
165
166 if (pointerDistanceChanged(mCurrentDoubleDownEvent, ev))
167 {
168 handled |= scaleGestureDetector.onTouchEvent(mCurrentDownEvent);
169 MotionEvent e = MotionEvent.obtain(ev);
170 e.setAction(mCurrentDoubleDownEvent.getAction());
171 handled |= scaleGestureDetector.onTouchEvent(e);
172 mCurrentMode = MODE_PINCH_ZOOM;
173 break;
174 }
175 else
176 {
177 mScrollDetectionScore++;
178 if (mScrollDetectionScore >= SCROLL_SCORE_TO_REACH)
179 mCurrentMode = MODE_SCROLL;
180 }
181 }
182
183 switch (mCurrentMode)
184 {
185 case MODE_PINCH_ZOOM:
186 if (scaleGestureDetector != null)
187 handled |= scaleGestureDetector.onTouchEvent(ev);
188 break;
189
190 case MODE_SCROLL:
192 break;
193
194 default:
195 handled = true;
196 break;
197 }
198
199 break;
200
201 case MotionEvent.ACTION_UP:
202
203 if (mPreviousPointerUpEvent != null &&
204 (ev.getEventTime() - mPreviousPointerUpEvent.getEventTime()) >
205 DOUBLE_TOUCH_TIMEOUT)
206 {
207 mPreviousPointerUpEvent.recycle();
208 mPreviousPointerUpEvent = null;
209 cancel();
210 break;
211 }
212
213
214 if (mCancelDetection || !mDoubleInProgress)
215 break;
216
217 boolean hasTapEvent = mHandler.hasMessages(TAP);
218 MotionEvent currentUpEvent = MotionEvent.obtain(ev);
219 if (mCurrentMode == MODE_UNKNOWN && hasTapEvent)
221 else if (mCurrentMode == MODE_PINCH_ZOOM)
222 handled = scaleGestureDetector.onTouchEvent(ev);
223
224 if (mPreviousUpEvent != null)
225 mPreviousUpEvent.recycle();
226
227
228 mPreviousUpEvent = currentUpEvent;
230 break;
231
232 case MotionEvent.ACTION_CANCEL:
233 cancel();
234 break;
235 }
236
237 if ((action == MotionEvent.ACTION_MOVE) && !handled)
238 handled = true;
239
240 return handled;
241 }
boolean onDoubleTouchScroll(MotionEvent e1, MotionEvent e2)
boolean onDoubleTouchUp(MotionEvent e)
boolean onDoubleTouchDown(MotionEvent e)
boolean onDoubleTouchSingleTap(MotionEvent e)