diff options
author | Romain Guy <romainguy@android.com> | 2009-05-29 13:53:16 -0700 |
---|---|---|
committer | Romain Guy <romainguy@android.com> | 2009-05-29 13:53:16 -0700 |
commit | d1c67d42abdf41d10c9a7589da1e0088af1e123a (patch) | |
tree | a6fc0eeae8c9d694a44e598b710543a469c774f5 /core/java/android/gesture | |
parent | d9cc7659fa9b8544e2a3ca7b7040fbd79afdf7ea (diff) | |
download | frameworks_base-d1c67d42abdf41d10c9a7589da1e0088af1e123a.zip frameworks_base-d1c67d42abdf41d10c9a7589da1e0088af1e123a.tar.gz frameworks_base-d1c67d42abdf41d10c9a7589da1e0088af1e123a.tar.bz2 |
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.
Diffstat (limited to 'core/java/android/gesture')
-rwxr-xr-x | core/java/android/gesture/GestureOverlayView.java | 100 | ||||
-rw-r--r-- | core/java/android/gesture/GestureStroke.java | 2 |
2 files changed, 56 insertions, 46 deletions
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<OnGestureListener> 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<OnGestureListener> 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<OnGestureListener> 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<OnGestureListener> 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<OnGestureListener> 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<OnGestureListener> 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<OnGesturePerformedListener> 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; |