Fix overscroll doesn't affect scrolling when released

Bug: 188531406

When an EdgeEffect is flung past 0 into negative values, it
shows a stretch from the other side. To prevent this, the EdgeEffect
animation is now terminated when it reaches 0. I also made it so
that dragging to a value of 0 releases the EdgeEffect.

I also fixed the nested scrolling so that the stretch release
of ListView occurs before the onNestedPreScroll().

Test: new tests and manual testing
Change-Id: Ia20a6b96d25cf31ef143511828ddce5c33cee804
This commit is contained in:
George Mount
2021-05-21 17:55:59 +00:00
parent 265c337728
commit d2cbe50f18
2 changed files with 17 additions and 11 deletions

View File

@@ -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) {

View File

@@ -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) {