From 76b297781fc88492d0ef60885d5b8d53629fd605 Mon Sep 17 00:00:00 2001 From: Anthony Restaino Date: Thu, 29 Sep 2016 19:56:30 -0400 Subject: [PATCH] Better interpolators for decelerate animations --- .../lightning/activity/BrowserActivity.java | 5 +-- .../fragment/anim/HorizontalItemAnimator.java | 4 ++- .../fragment/anim/VerticalItemAnimator.java | 4 ++- .../BezierDecelerateInterpolator.java | 31 +++++++++++++++++++ .../main/res/anim-v21/bezier_decelerate.xml | 6 ++++ app/src/main/res/anim/bezier_decelerate.xml | 2 ++ app/src/main/res/anim/fade_in_scale.xml | 2 +- app/src/main/res/anim/fade_out_scale.xml | 2 +- app/src/main/res/anim/slide_in_from_right.xml | 2 +- app/src/main/res/anim/slide_out_to_right.xml | 2 +- app/src/main/res/anim/slide_up_in.xml | 2 +- 11 files changed, 53 insertions(+), 9 deletions(-) create mode 100644 app/src/main/java/acr/browser/lightning/interpolator/BezierDecelerateInterpolator.java create mode 100644 app/src/main/res/anim-v21/bezier_decelerate.xml create mode 100644 app/src/main/res/anim/bezier_decelerate.xml diff --git a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java index abf99e4..fdd4897 100644 --- a/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java +++ b/app/src/main/java/acr/browser/lightning/activity/BrowserActivity.java @@ -113,6 +113,7 @@ import acr.browser.lightning.dialog.BrowserDialog; import acr.browser.lightning.dialog.LightningDialogBuilder; import acr.browser.lightning.fragment.BookmarksFragment; import acr.browser.lightning.fragment.TabsFragment; +import acr.browser.lightning.interpolator.BezierDecelerateInterpolator; import acr.browser.lightning.receiver.NetworkReceiver; import acr.browser.lightning.search.Suggestions; import acr.browser.lightning.utils.DrawableUtils; @@ -1932,7 +1933,7 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements } }; show.setDuration(250); - show.setInterpolator(new DecelerateInterpolator()); + show.setInterpolator(new BezierDecelerateInterpolator()); mBrowserFrame.startAnimation(show); } } @@ -1971,7 +1972,7 @@ public abstract class BrowserActivity extends ThemableBrowserActivity implements } }; show.setDuration(250); - show.setInterpolator(new DecelerateInterpolator()); + show.setInterpolator(new BezierDecelerateInterpolator()); mBrowserFrame.startAnimation(show); } } diff --git a/app/src/main/java/acr/browser/lightning/fragment/anim/HorizontalItemAnimator.java b/app/src/main/java/acr/browser/lightning/fragment/anim/HorizontalItemAnimator.java index 0fa4838..c16e41f 100644 --- a/app/src/main/java/acr/browser/lightning/fragment/anim/HorizontalItemAnimator.java +++ b/app/src/main/java/acr/browser/lightning/fragment/anim/HorizontalItemAnimator.java @@ -29,6 +29,8 @@ import android.view.animation.DecelerateInterpolator; import java.util.ArrayList; import java.util.List; +import acr.browser.lightning.interpolator.BezierDecelerateInterpolator; + /** * This implementation of {@link RecyclerView.ItemAnimator} provides basic * animations on remove, add, and move events that happen to the items in @@ -235,7 +237,7 @@ public class HorizontalItemAnimator extends SimpleItemAnimator { final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view); mAddAnimations.add(holder); animation.alpha(1).translationY(0) - .setInterpolator(new DecelerateInterpolator()).setDuration(getAddDuration()) + .setInterpolator(new BezierDecelerateInterpolator()).setDuration(getAddDuration()) .setListener(new VpaListenerAdapter() { @Override public void onAnimationStart(View view) { diff --git a/app/src/main/java/acr/browser/lightning/fragment/anim/VerticalItemAnimator.java b/app/src/main/java/acr/browser/lightning/fragment/anim/VerticalItemAnimator.java index b6ee56e..7352550 100644 --- a/app/src/main/java/acr/browser/lightning/fragment/anim/VerticalItemAnimator.java +++ b/app/src/main/java/acr/browser/lightning/fragment/anim/VerticalItemAnimator.java @@ -29,6 +29,8 @@ import android.view.animation.DecelerateInterpolator; import java.util.ArrayList; import java.util.List; +import acr.browser.lightning.interpolator.BezierDecelerateInterpolator; + /** * This implementation of {@link RecyclerView.ItemAnimator} provides basic * animations on remove, add, and move events that happen to the items in @@ -235,7 +237,7 @@ public class VerticalItemAnimator extends SimpleItemAnimator { final ViewPropertyAnimatorCompat animation = ViewCompat.animate(view); mAddAnimations.add(holder); animation.alpha(1).translationX(0).setDuration(getAddDuration()) - .setInterpolator(new DecelerateInterpolator()).setListener(new VpaListenerAdapter() { + .setInterpolator(new BezierDecelerateInterpolator()).setListener(new VpaListenerAdapter() { @Override public void onAnimationStart(View view) { dispatchAddStarting(holder); diff --git a/app/src/main/java/acr/browser/lightning/interpolator/BezierDecelerateInterpolator.java b/app/src/main/java/acr/browser/lightning/interpolator/BezierDecelerateInterpolator.java new file mode 100644 index 0000000..5ee0a3e --- /dev/null +++ b/app/src/main/java/acr/browser/lightning/interpolator/BezierDecelerateInterpolator.java @@ -0,0 +1,31 @@ +package acr.browser.lightning.interpolator; + +import android.os.Build; +import android.support.annotation.NonNull; +import android.view.animation.DecelerateInterpolator; +import android.view.animation.Interpolator; +import android.view.animation.PathInterpolator; + +/** + * Bezier decelerate curve similar to iOS. + * On Kitkat and below, it reverts to a + * decelerate interpolator. + */ +public class BezierDecelerateInterpolator implements Interpolator { + + @NonNull + private static final Interpolator PATH_INTERPOLATOR; + + static { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + PATH_INTERPOLATOR = new PathInterpolator(0.25f, 0.1f, 0.25f, 1); + } else { + PATH_INTERPOLATOR = new DecelerateInterpolator(); + } + } + + @Override + public float getInterpolation(float input) { + return PATH_INTERPOLATOR.getInterpolation(input); + } +} diff --git a/app/src/main/res/anim-v21/bezier_decelerate.xml b/app/src/main/res/anim-v21/bezier_decelerate.xml new file mode 100644 index 0000000..b528d2d --- /dev/null +++ b/app/src/main/res/anim-v21/bezier_decelerate.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/bezier_decelerate.xml b/app/src/main/res/anim/bezier_decelerate.xml new file mode 100644 index 0000000..63ed5f6 --- /dev/null +++ b/app/src/main/res/anim/bezier_decelerate.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/app/src/main/res/anim/fade_in_scale.xml b/app/src/main/res/anim/fade_in_scale.xml index 4021eef..c4e135b 100644 --- a/app/src/main/res/anim/fade_in_scale.xml +++ b/app/src/main/res/anim/fade_in_scale.xml @@ -4,7 +4,7 @@ android:duration="@integer/animation_time_medium" android:fromXScale="0.85" android:fromYScale="0.85" - android:interpolator="@android:interpolator/decelerate_cubic" + android:interpolator="@anim/bezier_decelerate" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="1.0" diff --git a/app/src/main/res/anim/fade_out_scale.xml b/app/src/main/res/anim/fade_out_scale.xml index e65ec67..c6df9ee 100644 --- a/app/src/main/res/anim/fade_out_scale.xml +++ b/app/src/main/res/anim/fade_out_scale.xml @@ -4,7 +4,7 @@ android:duration="@integer/animation_time_medium" android:fromXScale="1.0" android:fromYScale="1.0" - android:interpolator="@android:interpolator/decelerate_cubic" + android:interpolator="@anim/bezier_decelerate" android:pivotX="50%p" android:pivotY="50%p" android:toXScale="0.85" diff --git a/app/src/main/res/anim/slide_in_from_right.xml b/app/src/main/res/anim/slide_in_from_right.xml index 5376037..540a680 100644 --- a/app/src/main/res/anim/slide_in_from_right.xml +++ b/app/src/main/res/anim/slide_in_from_right.xml @@ -3,7 +3,7 @@ diff --git a/app/src/main/res/anim/slide_out_to_right.xml b/app/src/main/res/anim/slide_out_to_right.xml index 5f27e58..a77ba4c 100644 --- a/app/src/main/res/anim/slide_out_to_right.xml +++ b/app/src/main/res/anim/slide_out_to_right.xml @@ -3,7 +3,7 @@ diff --git a/app/src/main/res/anim/slide_up_in.xml b/app/src/main/res/anim/slide_up_in.xml index 6682e82..5864e97 100644 --- a/app/src/main/res/anim/slide_up_in.xml +++ b/app/src/main/res/anim/slide_up_in.xml @@ -3,7 +3,7 @@