diff options
| -rw-r--r-- | core/java/android/widget/AbsListView.java | 17 | ||||
| -rw-r--r-- | core/java/android/widget/EdgeEffect.java | 11 |
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) { |