From 9c3f172d9c10d8144c44c069e19d854b375e6112 Mon Sep 17 00:00:00 2001 From: Sunny Goyal Date: Tue, 29 May 2018 12:12:59 -0700 Subject: Accounting for one frame jump when starting a fling animation Bug: 80292740 Change-Id: I47bca071d42d1d217068c128f9793e87210d0286 --- quickstep/src/com/android/quickstep/AnimatedFloat.java | 4 ++-- .../android/quickstep/WindowTransformSwipeHandler.java | 16 +++++++++++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/quickstep/src/com/android/quickstep/AnimatedFloat.java b/quickstep/src/com/android/quickstep/AnimatedFloat.java index 84dfa457e..84dfdbd1d 100644 --- a/quickstep/src/com/android/quickstep/AnimatedFloat.java +++ b/quickstep/src/com/android/quickstep/AnimatedFloat.java @@ -46,9 +46,9 @@ public class AnimatedFloat { mUpdateCallback = updateCallback; } - public ObjectAnimator animateToValue(float v) { + public ObjectAnimator animateToValue(float start, float end) { cancelAnimation(); - mValueAnimator = ObjectAnimator.ofFloat(this, VALUE, v); + mValueAnimator = ObjectAnimator.ofFloat(this, VALUE, start, end); mValueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animator) { diff --git a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java index 939811bd1..b1663b169 100644 --- a/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java +++ b/quickstep/src/com/android/quickstep/WindowTransformSwipeHandler.java @@ -16,6 +16,7 @@ package com.android.quickstep; import static com.android.launcher3.BaseActivity.INVISIBLE_BY_STATE_HANDLER; +import static com.android.launcher3.Utilities.SINGLE_FRAME_MS; import static com.android.launcher3.Utilities.postAsyncCallback; import static com.android.launcher3.anim.Interpolators.DEACCEL; import static com.android.launcher3.anim.Interpolators.LINEAR; @@ -470,7 +471,7 @@ public class WindowTransformSwipeHandler { setStateOnUiThread(STATE_QUICK_SCRUB_START | STATE_GESTURE_COMPLETED); // Start the window animation without waiting for launcher. - animateToProgress(1f, QUICK_SCRUB_FROM_APP_START_DURATION, LINEAR); + animateToProgress(mCurrentShift.value, 1f, QUICK_SCRUB_FROM_APP_START_DURATION, LINEAR); } private void shiftAnimationDestinationForQuickscrub() { @@ -647,11 +648,13 @@ public class WindowTransformSwipeHandler { private void handleNormalGestureEnd(float endVelocity, boolean isFling) { long duration = MAX_SWIPE_DURATION; final float endShift; + final float startShift; if (!isFling) { endShift = mCurrentShift.value >= MIN_PROGRESS_FOR_OVERVIEW && mGestureStarted ? 1 : 0; long expectedDuration = Math.abs(Math.round((endShift - mCurrentShift.value) * MAX_SWIPE_DURATION * SWIPE_DURATION_MULTIPLIER)); duration = Math.min(MAX_SWIPE_DURATION, expectedDuration); + startShift = mCurrentShift.value; } else { endShift = endVelocity < 0 ? 1 : 0; float minFlingVelocity = mContext.getResources() @@ -665,9 +668,11 @@ public class WindowTransformSwipeHandler { long baseDuration = Math.round(1000 * Math.abs(distanceToTravel / endVelocity)); duration = Math.min(MAX_SWIPE_DURATION, 2 * baseDuration); } + startShift = Utilities.boundToRange(mCurrentShift.value - endVelocity * SINGLE_FRAME_MS + / (mTransitionDragLength * 1000), 0, 1); } - animateToProgress(endShift, duration, DEACCEL); + animateToProgress(startShift, endShift, duration, DEACCEL); } private void doLogGesture(boolean toLauncher) { @@ -687,9 +692,10 @@ public class WindowTransformSwipeHandler { } /** Animates to the given progress, where 0 is the current app and 1 is overview. */ - private void animateToProgress(float progress, long duration, Interpolator interpolator) { - mIsGoingToHome = Float.compare(progress, 1) == 0; - ObjectAnimator anim = mCurrentShift.animateToValue(progress).setDuration(duration); + private void animateToProgress(float start, float end, long duration, + Interpolator interpolator) { + mIsGoingToHome = Float.compare(end, 1) == 0; + ObjectAnimator anim = mCurrentShift.animateToValue(start, end).setDuration(duration); anim.setInterpolator(interpolator); anim.addListener(new AnimationSuccessListener() { @Override -- cgit v1.2.3