summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRomain Guy <romainguy@android.com>2009-05-29 13:53:16 -0700
committerRomain Guy <romainguy@android.com>2009-05-29 13:53:16 -0700
commitd1c67d42abdf41d10c9a7589da1e0088af1e123a (patch)
treea6fc0eeae8c9d694a44e598b710543a469c774f5
parentd9cc7659fa9b8544e2a3ca7b7040fbd79afdf7ea (diff)
downloadframeworks_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.
-rwxr-xr-xcore/java/android/gesture/GestureOverlayView.java100
-rw-r--r--core/java/android/gesture/GestureStroke.java2
-rw-r--r--core/res/res/values/styles.xml2
3 files changed, 57 insertions, 47 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;
diff --git a/core/res/res/values/styles.xml b/core/res/res/values/styles.xml
index 490abde..72402d0 100644
--- a/core/res/res/values/styles.xml
+++ b/core/res/res/values/styles.xml
@@ -177,7 +177,7 @@
<item name="android:uncertainGestureColor">#48ffff00</item>
<item name="android:fadeOffset">420</item>
<item name="android:fadeDuration">150</item>
- <item name="android:gestureStrokeLengthThreshold">30.0</item>
+ <item name="android:gestureStrokeLengthThreshold">50.0</item>
<item name="android:gestureStrokeSquarenessThreshold">0.275</item>
<item name="android:gestureStrokeAngleThreshold">40.0</item>
<item name="android:eventsInterceptionEnabled">true</item>