Merge "Fix overscroll doesn't affect scrolling when released" into sc-dev

This commit is contained in:
George Mount
2021-05-24 15:19:49 +00:00
committed by Android (Google) Code Review
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) {