From 4d6b1a95a13fd6f5b293ba97051bc645fab95334 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Mon, 11 Jun 2018 16:36:24 -0700 Subject: [PATCH] Adding overscroll effect in recents list Bug: 109828536 Change-Id: If2b65cfc2b7f14deb721436f7aa378c4a2c5c468 --- .../android/quickstep/views/RecentsView.java | 3 +- .../android/launcher3/LauncherScroller.java | 4 +- src/com/android/launcher3/PagedView.java | 66 +++---------------- 3 files changed, 13 insertions(+), 60 deletions(-) diff --git a/quickstep/src/com/android/quickstep/views/RecentsView.java b/quickstep/src/com/android/quickstep/views/RecentsView.java index ee97c065ad..fdb506bd79 100644 --- a/quickstep/src/com/android/quickstep/views/RecentsView.java +++ b/quickstep/src/com/android/quickstep/views/RecentsView.java @@ -259,7 +259,8 @@ public abstract class RecentsView extends PagedView impl public RecentsView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); setPageSpacing(getResources().getDimensionPixelSize(R.dimen.recents_page_spacing)); - enableFreeScroll(true); + setEnableFreeScroll(true); + setEnableOverscroll(true); setClipToOutline(true); mFastFlingVelocity = getResources() diff --git a/src/com/android/launcher3/LauncherScroller.java b/src/com/android/launcher3/LauncherScroller.java index a9b49556bb..af87550ea1 100644 --- a/src/com/android/launcher3/LauncherScroller.java +++ b/src/com/android/launcher3/LauncherScroller.java @@ -459,13 +459,13 @@ public class LauncherScroller { return Math.log(INFLEXION * Math.abs(velocity) / (mFlingFriction * mPhysicalCoeff)); } - private int getSplineFlingDuration(float velocity) { + public int getSplineFlingDuration(float velocity) { final double l = getSplineDeceleration(velocity); final double decelMinusOne = DECELERATION_RATE - 1.0; return (int) (1000.0 * Math.exp(l / decelMinusOne)); } - private double getSplineFlingDistance(float velocity) { + public double getSplineFlingDistance(float velocity) { final double l = getSplineDeceleration(velocity); final double decelMinusOne = DECELERATION_RATE - 1.0; return mFlingFriction * mPhysicalCoeff * Math.exp(DECELERATION_RATE / decelMinusOne * l); diff --git a/src/com/android/launcher3/PagedView.java b/src/com/android/launcher3/PagedView.java index db5dc6635b..0cb653900e 100644 --- a/src/com/android/launcher3/PagedView.java +++ b/src/com/android/launcher3/PagedView.java @@ -63,7 +63,6 @@ public abstract class PagedView extends ViewGrou protected static final ComputePageScrollsLogic SIMPLE_SCROLL_LOGIC = (v) -> v.getVisibility() != GONE; public static final int PAGE_SNAP_ANIMATION_DURATION = 750; - public static final int SLOW_PAGE_SNAP_ANIMATION_DURATION = 950; // OverScroll constants private final static int OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION = 270; @@ -83,7 +82,6 @@ public abstract class PagedView extends ViewGrou public static final int INVALID_RESTORE_PAGE = -1001; private boolean mFreeScroll = false; - private boolean mSettleOnPageInFreeScroll = false; protected int mFlingThresholdVelocity; protected int mMinFlingVelocity; @@ -356,17 +354,6 @@ public abstract class PagedView extends ViewGrou @Override public void scrollTo(int x, int y) { - // In free scroll mode, we clamp the scrollX - if (mFreeScroll) { - // If the scroller is trying to move to a location beyond the maximum allowed - // in the free scroll mode, we make sure to end the scroll operation. - if (!mScroller.isFinished() && (x > mMaxScrollX || x < 0)) { - forceFinishScroller(false); - } - - x = Utilities.boundToRange(x, 0, mMaxScrollX); - } - mUnboundedScrollX = x; boolean isXBeforeFirstPage = mIsRtl ? (x > mMaxScrollX) : (x < 0); @@ -1026,13 +1013,7 @@ public abstract class PagedView extends ViewGrou dampedOverScroll(amount); } - - protected void enableFreeScroll(boolean settleOnPageInFreeScroll) { - setEnableFreeScroll(true); - mSettleOnPageInFreeScroll = settleOnPageInFreeScroll; - } - - private void setEnableFreeScroll(boolean freeScroll) { + protected void setEnableFreeScroll(boolean freeScroll) { boolean wasFreeScroll = mFreeScroll; mFreeScroll = freeScroll; @@ -1041,8 +1022,6 @@ public abstract class PagedView extends ViewGrou } else if (wasFreeScroll) { snapToPage(getNextPage()); } - - setEnableOverscroll(!freeScroll); } protected void setEnableOverscroll(boolean enable) { @@ -1155,42 +1134,15 @@ public abstract class PagedView extends ViewGrou snapToDestination(); } } else { - if (!mScroller.isFinished()) { - abortScrollerAnimation(true); + int unscaledScrollX = getScrollX() - (int) Math.round( + mScroller.getSplineFlingDistance(velocityX) * Math.signum(velocityX)); + int duration = mScroller.getSplineFlingDuration(velocityX); + int finalPage = getPageNearestToCenterOfScreen(unscaledScrollX); + if ((isFling || isSignificantMove) && (finalPage != mCurrentPage)) { + snapToPage(finalPage, duration); + } else { + snapToDestination(); } - - float scaleX = getScaleX(); - int vX = (int) (-velocityX * scaleX); - int initialScrollX = (int) (getScrollX() * scaleX); - - mScroller.setInterpolator(mDefaultInterpolator); - mScroller.fling(initialScrollX, - getScrollY(), vX, 0, Integer.MIN_VALUE, Integer.MAX_VALUE, 0, 0); - int unscaledScrollX = (int) (mScroller.getFinalX() / scaleX); - mNextPage = getPageNearestToCenterOfScreen(unscaledScrollX); - int firstPageScroll = getScrollForPage(!mIsRtl ? 0 : getPageCount() - 1); - int lastPageScroll = getScrollForPage(!mIsRtl ? getPageCount() - 1 : 0); - if (mSettleOnPageInFreeScroll && unscaledScrollX > 0 - && unscaledScrollX < mMaxScrollX) { - // If scrolling ends in the half of the added space that is closer to the - // end, settle to the end. Otherwise snap to the nearest page. - // If flinging past one of the ends, don't change the velocity as it will - // get stopped at the end anyway. - final int finalX = unscaledScrollX < firstPageScroll / 2 ? - 0 : - unscaledScrollX > (lastPageScroll + mMaxScrollX) / 2 ? - mMaxScrollX : - getScrollForPage(mNextPage); - - mScroller.setFinalX((int) (finalX * getScaleX())); - // Ensure the scroll/snap doesn't happen too fast; - int extraScrollDuration = OVERSCROLL_PAGE_SNAP_ANIMATION_DURATION - - mScroller.getDuration(); - if (extraScrollDuration > 0) { - mScroller.extendDuration(extraScrollDuration); - } - } - invalidate(); } onScrollInteractionEnd(); } else if (mTouchState == TOUCH_STATE_PREV_PAGE) {