From d1c67d42abdf41d10c9a7589da1e0088af1e123a Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Fri, 29 May 2009 13:53:16 -0700 Subject: Fixes #1878499. Ignore touch up events that happen after a gesture was cancelled. This fix also improves performance by ignoring move events that are within the touch threshold. --- core/java/android/gesture/GestureOverlayView.java | 100 ++++++++++++---------- core/java/android/gesture/GestureStroke.java | 2 +- 2 files changed, 56 insertions(+), 46 deletions(-) (limited to 'core/java/android/gesture') diff --git a/core/java/android/gesture/GestureOverlayView.java b/core/java/android/gesture/GestureOverlayView.java index c21cc55..cc58f1d 100755 --- a/core/java/android/gesture/GestureOverlayView.java +++ b/core/java/android/gesture/GestureOverlayView.java @@ -75,7 +75,7 @@ public class GestureOverlayView extends FrameLayout { private int mInvalidateExtraBorder = 10; private int mGestureStrokeType = GESTURE_STROKE_TYPE_SINGLE; - private float mGestureStrokeLengthThreshold = 30.0f; + private float mGestureStrokeLengthThreshold = 50.0f; private float mGestureStrokeSquarenessTreshold = 0.275f; private float mGestureStrokeAngleThreshold = 40.0f; @@ -554,39 +554,39 @@ public class GestureOverlayView extends FrameLayout { mX = x; mY = y; - } - mStrokeBuffer.add(new GesturePoint(x, y, event.getEventTime())); + mStrokeBuffer.add(new GesturePoint(x, y, event.getEventTime())); - if (mHandleGestureActions && !mIsGesturing) { - mTotalLength += (float) Math.sqrt(dx * dx + dy * dy); + if (mHandleGestureActions && !mIsGesturing) { + mTotalLength += (float) Math.sqrt(dx * dx + dy * dy); - if (mTotalLength > mGestureStrokeLengthThreshold) { - final OrientedBoundingBox box = - GestureUtilities.computeOrientedBoundingBox(mStrokeBuffer); + if (mTotalLength > mGestureStrokeLengthThreshold) { + final OrientedBoundingBox box = + GestureUtilities.computeOrientedBoundingBox(mStrokeBuffer); - float angle = Math.abs(box.orientation); - if (angle > 90) { - angle = 180 - angle; - } + float angle = Math.abs(box.orientation); + if (angle > 90) { + angle = 180 - angle; + } - if (box.squareness > mGestureStrokeSquarenessTreshold || - (mOrientation == ORIENTATION_VERTICAL ? - angle < mGestureStrokeAngleThreshold : - angle > mGestureStrokeAngleThreshold)) { + if (box.squareness > mGestureStrokeSquarenessTreshold || + (mOrientation == ORIENTATION_VERTICAL ? + angle < mGestureStrokeAngleThreshold : + angle > mGestureStrokeAngleThreshold)) { - mIsGesturing = true; - setCurrentColor(mCertainGestureColor); + mIsGesturing = true; + setCurrentColor(mCertainGestureColor); + } } } - } - // pass the event to handlers - final ArrayList listeners = mOnGestureListeners; - final int count = listeners.size(); - for (int i = 0; i < count; i++) { - listeners.get(i).onGesture(this, event); - } + // pass the event to handlers + final ArrayList listeners = mOnGestureListeners; + final int count = listeners.size(); + for (int i = 0; i < count; i++) { + listeners.get(i).onGesture(this, event); + } + } return areaToRefresh; } @@ -594,35 +594,45 @@ public class GestureOverlayView extends FrameLayout { private void touchUp(MotionEvent event, boolean cancel) { mIsListeningForGestures = false; - // add the stroke to the current gesture - mCurrentGesture.addStroke(new GestureStroke(mStrokeBuffer)); - mStrokeBuffer.clear(); + // A gesture wasn't started or was cancelled + if (mCurrentGesture != null) { + // add the stroke to the current gesture + mCurrentGesture.addStroke(new GestureStroke(mStrokeBuffer)); + + if (!cancel) { + // pass the event to handlers + final ArrayList listeners = mOnGestureListeners; + int count = listeners.size(); + for (int i = 0; i < count; i++) { + listeners.get(i).onGestureEnded(this, event); + } - if (!cancel) { - // pass the event to handlers - final ArrayList listeners = mOnGestureListeners; - int count = listeners.size(); - for (int i = 0; i < count; i++) { - listeners.get(i).onGestureEnded(this, event); - } + if (mHandleGestureActions) { + clear(mFadeEnabled, mIsGesturing); + } + } else { + cancelGesture(event); - if (mHandleGestureActions) { - clear(mFadeEnabled, mIsGesturing); } } else { - // pass the event to handlers - final ArrayList listeners = mOnGestureListeners; - final int count = listeners.size(); - for (int i = 0; i < count; i++) { - listeners.get(i).onGestureCancelled(this, event); - } - - clear(false); + cancelGesture(event); } + mStrokeBuffer.clear(); mIsGesturing = false; } + private void cancelGesture(MotionEvent event) { + // pass the event to handlers + final ArrayList listeners = mOnGestureListeners; + final int count = listeners.size(); + for (int i = 0; i < count; i++) { + listeners.get(i).onGestureCancelled(this, event); + } + + clear(false); + } + private void fireOnGesturePerformed() { final ArrayList actionListeners = mOnGesturePerformedListeners; diff --git a/core/java/android/gesture/GestureStroke.java b/core/java/android/gesture/GestureStroke.java index 90faaed..598eb85 100644 --- a/core/java/android/gesture/GestureStroke.java +++ b/core/java/android/gesture/GestureStroke.java @@ -30,7 +30,7 @@ import java.util.ArrayList; * A gesture stroke started on a touch down and ended on a touch up. */ public class GestureStroke { - static final float TOUCH_TOLERANCE = 3; + static final float TOUCH_TOLERANCE = 8; public final RectF boundingBox; -- cgit v1.1