From dcecfcf76f300652fa6faed47158276cc070e332 Mon Sep 17 00:00:00 2001 From: Jason Chang Date: Mon, 12 Apr 2021 16:40:56 +0800 Subject: Fix One Handed Feedback gesture's animations are quite jarring To provide a new Interpolator formula for One-Handed transition animation. Bug: 178355565 Test: manual Test: atest WMShellUnitTests Change-Id: I78d998569618dc52c8b6fce6cb4a71f13ad01ba8 --- libs/WindowManager/Shell/res/values/config.xml | 2 +- .../onehanded/OneHandedAnimationController.java | 22 +++++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml index 6698a01dc159..a138fee32550 100644 --- a/libs/WindowManager/Shell/res/values/config.xml +++ b/libs/WindowManager/Shell/res/values/config.xml @@ -40,7 +40,7 @@ 250 - 300 + 800 40% diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java index 125e322974bf..25dd3ca57b92 100644 --- a/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java +++ b/libs/WindowManager/Shell/src/com/android/wm/shell/onehanded/OneHandedAnimationController.java @@ -22,8 +22,7 @@ import android.annotation.IntDef; import android.content.Context; import android.graphics.Rect; import android.view.SurfaceControl; -import android.view.animation.Interpolator; -import android.view.animation.OvershootInterpolator; +import android.view.animation.BaseInterpolator; import android.window.WindowContainerToken; import androidx.annotation.VisibleForTesting; @@ -54,7 +53,7 @@ public class OneHandedAnimationController { public @interface TransitionDirection { } - private final Interpolator mOvershootInterpolator; + private final OneHandedInterpolator mInterpolator; private final OneHandedSurfaceTransactionHelper mSurfaceTransactionHelper; private final HashMap mAnimatorMap = new HashMap<>(); @@ -64,7 +63,7 @@ public class OneHandedAnimationController { */ public OneHandedAnimationController(Context context) { mSurfaceTransactionHelper = new OneHandedSurfaceTransactionHelper(context); - mOvershootInterpolator = new OvershootInterpolator(); + mInterpolator = new OneHandedInterpolator(); } @SuppressWarnings("unchecked") @@ -102,7 +101,7 @@ public class OneHandedAnimationController { OneHandedTransitionAnimator setupOneHandedTransitionAnimator( OneHandedTransitionAnimator animator) { animator.setSurfaceTransactionHelper(mSurfaceTransactionHelper); - animator.setInterpolator(mOvershootInterpolator); + animator.setInterpolator(mInterpolator); animator.setFloatValues(FRACTION_START, FRACTION_END); return animator; } @@ -112,6 +111,8 @@ public class OneHandedAnimationController { * * @param Type of property to animate, either offset (float) */ + // TODO: Refactoring to use SpringAnimation and DynamicAnimation instead of using ValueAnimator + // to implement One-Handed transition animation. (b/185129031) public abstract static class OneHandedTransitionAnimator extends ValueAnimator implements ValueAnimator.AnimatorUpdateListener, ValueAnimator.AnimatorListener { @@ -297,4 +298,15 @@ public class OneHandedAnimationController { }; } } + + /** + * An Interpolator for One-Handed transition animation. + */ + public class OneHandedInterpolator extends BaseInterpolator { + @Override + public float getInterpolation(float input) { + return (float) (Math.pow(2, -10 * input) * Math.sin(((input - 4.0f) / 4.0f) + * (2.0f * Math.PI) / 4.0f) + 1); + } + } } -- cgit v1.2.3-59-g8ed1b