summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/widget/AbsListView.java17
-rw-r--r--core/java/android/widget/EdgeEffect.java11
2 files changed, 17 insertions, 11 deletions
diff --git a/core/java/android/widget/AbsListView.java b/core/java/android/widget/AbsListView.java
index 4d3565556a68..5e2209e65f45 100644
--- a/core/java/android/widget/AbsListView.java
+++ b/core/java/android/widget/AbsListView.java
@@ -3574,28 +3574,27 @@ public abstract class AbsListView extends AdapterView<ListAdapter> implements Te
private void scrollIfNeeded(int x, int y, MotionEvent vtev) {
int rawDeltaY = y - mMotionY;
int scrollOffsetCorrection = 0;
- int scrollConsumedCorrection = 0;
if (mLastY == Integer.MIN_VALUE) {
rawDeltaY -= mMotionCorrection;
}
- if (dispatchNestedPreScroll(0, mLastY != Integer.MIN_VALUE ? mLastY - y : -rawDeltaY,
- mScrollConsumed, mScrollOffset)) {
+
+ int incrementalDeltaY = mLastY != Integer.MIN_VALUE ? y - mLastY : rawDeltaY;
+
+ // First allow releasing existing overscroll effect:
+ incrementalDeltaY = releaseGlow(incrementalDeltaY, x);
+
+ if (dispatchNestedPreScroll(0, -incrementalDeltaY, mScrollConsumed, mScrollOffset)) {
rawDeltaY += mScrollConsumed[1];
scrollOffsetCorrection = -mScrollOffset[1];
- scrollConsumedCorrection = mScrollConsumed[1];
+ incrementalDeltaY += mScrollConsumed[1];
if (vtev != null) {
vtev.offsetLocation(0, mScrollOffset[1]);
mNestedYOffset += mScrollOffset[1];
}
}
final int deltaY = rawDeltaY;
- int incrementalDeltaY =
- mLastY != Integer.MIN_VALUE ? y - mLastY + scrollConsumedCorrection : deltaY;
int lastYCorrection = 0;
- // First allow releasing existing overscroll effect:
- incrementalDeltaY = releaseGlow(incrementalDeltaY, x);
-
if (mTouchMode == TOUCH_MODE_SCROLL) {
if (PROFILE_SCROLLING) {
if (!mScrollProfilingStarted) {
diff --git a/core/java/android/widget/EdgeEffect.java b/core/java/android/widget/EdgeEffect.java
index 756e3ce91bf9..207385d12d90 100644
--- a/core/java/android/widget/EdgeEffect.java
+++ b/core/java/android/widget/EdgeEffect.java
@@ -342,6 +342,9 @@ public class EdgeEffect {
mGlowAlphaFinish = mGlowAlpha;
mGlowScaleYFinish = mGlowScaleY;
+ if (mEdgeEffectType == TYPE_STRETCH && mDistance == 0) {
+ mState = STATE_IDLE;
+ }
}
/**
@@ -739,8 +742,12 @@ public class EdgeEffect {
private boolean isAtEquilibrium() {
double displacement = mDistance * mHeight; // in pixels
double velocity = mVelocity;
- return Math.abs(velocity) < VELOCITY_THRESHOLD
- && Math.abs(displacement) < VALUE_THRESHOLD;
+
+ // Don't allow displacement to drop below 0. We don't want it stretching the opposite
+ // direction if it is flung that way. We also want to stop the animation as soon as
+ // it gets very close to its destination.
+ return displacement < 0 || (Math.abs(velocity) < VELOCITY_THRESHOLD
+ && displacement < VALUE_THRESHOLD);
}
private float dampStretchVector(float normalizedVec) {