summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/view/VelocityTracker.java18
1 files changed, 16 insertions, 2 deletions
diff --git a/core/java/android/view/VelocityTracker.java b/core/java/android/view/VelocityTracker.java
index fb88c7135ba6..b1fdec89f147 100644
--- a/core/java/android/view/VelocityTracker.java
+++ b/core/java/android/view/VelocityTracker.java
@@ -41,6 +41,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
private static final int MAX_AGE_MILLISECONDS = 200;
private static final int POINTER_POOL_CAPACITY = 20;
+ private static final int INVALID_POINTER = -1;
private static final Pool<VelocityTracker> sPool = Pools.synchronizedPool(
Pools.finitePool(new PoolableManager<VelocityTracker>() {
@@ -76,6 +77,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
private Pointer mPointerListHead; // sorted by id in increasing order
private int mLastTouchIndex;
private int mGeneration;
+ private int mActivePointerId;
private VelocityTracker mNext;
@@ -125,6 +127,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
mPointerListHead = null;
mLastTouchIndex = 0;
+ mActivePointerId = INVALID_POINTER;
}
/**
@@ -180,6 +183,10 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
// Pointer went down. Add it to the list.
// Write a sentinel at the end of the pastTime trace so we will be able to
// tell when the trace started.
+ if (mActivePointerId == INVALID_POINTER) {
+ // Congratulations! You're the new active pointer!
+ mActivePointerId = pointerId;
+ }
pointer = obtainPointer();
pointer.id = pointerId;
pointer.pastTime[lastTouchIndex] = Long.MIN_VALUE;
@@ -214,6 +221,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
previousPointer = null;
for (Pointer pointer = mPointerListHead; pointer != null; ) {
final Pointer nextPointer = pointer.next;
+ final int pointerId = pointer.id;
if (pointer.generation != generation) {
// Pointer went up. Remove it from the list.
if (previousPointer == null) {
@@ -222,6 +230,12 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
previousPointer.next = nextPointer;
}
releasePointer(pointer);
+
+ if (pointerId == mActivePointerId) {
+ // Pick a new active pointer. How is arbitrary.
+ mActivePointerId = mPointerListHead != null ?
+ mPointerListHead.id : INVALID_POINTER;
+ }
} else {
previousPointer = pointer;
}
@@ -334,7 +348,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
* @return The previously computed X velocity.
*/
public float getXVelocity() {
- Pointer pointer = getPointer(0);
+ Pointer pointer = getPointer(mActivePointerId);
return pointer != null ? pointer.xVelocity : 0;
}
@@ -345,7 +359,7 @@ public final class VelocityTracker implements Poolable<VelocityTracker> {
* @return The previously computed Y velocity.
*/
public float getYVelocity() {
- Pointer pointer = getPointer(0);
+ Pointer pointer = getPointer(mActivePointerId);
return pointer != null ? pointer.yVelocity : 0;
}