diff options
author | Charlie Anderson <charlander@google.com> | 2023-02-23 22:03:19 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-02-23 22:03:19 +0000 |
commit | 712fd6e1bce663bfbe48ce740b2c692dc1ac60ac (patch) | |
tree | 6ff69a7158cdaed1f28238fb6e641c0b57121813 /src/com/android/launcher3/popup | |
parent | eb8717d7cc9062490c34ed8e34f138695ce32444 (diff) | |
parent | 2010ea7b273cfd576eafa9e7c4c27db4de0cf524 (diff) | |
download | Launcher3-712fd6e1bce663bfbe48ce740b2c692dc1ac60ac.tar.gz |
Adds new motion animation for U popups am: 6259084496 am: 2010ea7b27
Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Launcher3/+/21338099
Change-Id: I1516ae6ba070c2736971b333fedfb0220f3c0bdb
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'src/com/android/launcher3/popup')
-rw-r--r-- | src/com/android/launcher3/popup/ArrowPopup.java | 109 |
1 files changed, 106 insertions, 3 deletions
diff --git a/src/com/android/launcher3/popup/ArrowPopup.java b/src/com/android/launcher3/popup/ArrowPopup.java index c23ea8aa4f..a0f21dc297 100644 --- a/src/com/android/launcher3/popup/ArrowPopup.java +++ b/src/com/android/launcher3/popup/ArrowPopup.java @@ -20,6 +20,8 @@ import static androidx.core.content.ContextCompat.getColorStateList; import static com.android.launcher3.anim.Interpolators.ACCELERATED_EASE; import static com.android.launcher3.anim.Interpolators.DECELERATED_EASE; +import static com.android.launcher3.anim.Interpolators.EMPHASIZED_ACCELERATE; +import static com.android.launcher3.anim.Interpolators.EMPHASIZED_DECELERATE; import static com.android.launcher3.anim.Interpolators.LINEAR; import static com.android.launcher3.config.FeatureFlags.ENABLE_MATERIAL_U_POPUP; @@ -37,11 +39,13 @@ import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.util.AttributeSet; import android.util.Pair; +import android.util.Property; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.Interpolator; +import android.view.animation.PathInterpolator; import android.widget.FrameLayout; import androidx.annotation.Nullable; @@ -81,6 +85,19 @@ public abstract class ArrowPopup<T extends Context & ActivityContext> protected int CLOSE_CHILD_FADE_START_DELAY = 0; protected int CLOSE_CHILD_FADE_DURATION = 140; + private static final int OPEN_DURATION_U = 200; + private static final int OPEN_FADE_START_DELAY_U = 0; + private static final int OPEN_FADE_DURATION_U = 83; + private static final int OPEN_CHILD_FADE_START_DELAY_U = 0; + private static final int OPEN_CHILD_FADE_DURATION_U = 83; + private static final int OPEN_OVERSHOOT_DURATION_U = 200; + + private static final int CLOSE_DURATION_U = 233; + private static final int CLOSE_FADE_START_DELAY_U = 150; + private static final int CLOSE_FADE_DURATION_U = 83; + private static final int CLOSE_CHILD_FADE_START_DELAY_U = 150; + private static final int CLOSE_CHILD_FADE_DURATION_U = 83; + protected final Rect mTempRect = new Rect(); protected final LayoutInflater mInflater; @@ -104,6 +121,7 @@ public abstract class ArrowPopup<T extends Context & ActivityContext> protected AnimatorSet mOpenCloseAnimator; protected boolean mDeferContainerRemoval; protected boolean shouldScaleArrow = false; + protected boolean mIsArrowRotated = false; private final GradientDrawable mRoundedTop; private final GradientDrawable mRoundedBottom; @@ -591,10 +609,24 @@ public abstract class ArrowPopup<T extends Context & ActivityContext> protected void animateOpen() { setVisibility(View.VISIBLE); + mOpenCloseAnimator = ENABLE_MATERIAL_U_POPUP.get() + ? getMaterialUOpenCloseAnimator( + true, + OPEN_DURATION_U, + OPEN_FADE_START_DELAY_U, + OPEN_FADE_DURATION_U, + OPEN_CHILD_FADE_START_DELAY_U, + OPEN_CHILD_FADE_DURATION_U, + EMPHASIZED_DECELERATE) + : getOpenCloseAnimator( + true, + OPEN_DURATION, + OPEN_FADE_START_DELAY, + OPEN_FADE_DURATION, + OPEN_CHILD_FADE_START_DELAY, + OPEN_CHILD_FADE_DURATION, + DECELERATED_EASE); - mOpenCloseAnimator = getOpenCloseAnimator(true, OPEN_DURATION, OPEN_FADE_START_DELAY, - OPEN_FADE_DURATION, OPEN_CHILD_FADE_START_DELAY, OPEN_CHILD_FADE_DURATION, - DECELERATED_EASE); onCreateOpenAnimation(mOpenCloseAnimator); mOpenCloseAnimator.addListener(new AnimatorListenerAdapter() { @Override @@ -680,6 +712,24 @@ public abstract class ArrowPopup<T extends Context & ActivityContext> mOpenCloseAnimator = getOpenCloseAnimator(false, CLOSE_DURATION, CLOSE_FADE_START_DELAY, CLOSE_FADE_DURATION, CLOSE_CHILD_FADE_START_DELAY, CLOSE_CHILD_FADE_DURATION, ACCELERATED_EASE); + + mOpenCloseAnimator = ENABLE_MATERIAL_U_POPUP.get() + ? getMaterialUOpenCloseAnimator( + false, + CLOSE_DURATION_U, + CLOSE_FADE_START_DELAY_U, + CLOSE_FADE_DURATION_U, + CLOSE_CHILD_FADE_START_DELAY_U, + CLOSE_CHILD_FADE_DURATION_U, + EMPHASIZED_ACCELERATE) + : getOpenCloseAnimator(false, + CLOSE_DURATION, + CLOSE_FADE_START_DELAY, + CLOSE_FADE_DURATION, + CLOSE_CHILD_FADE_START_DELAY, + CLOSE_CHILD_FADE_DURATION, + ACCELERATED_EASE); + onCreateCloseAnimation(mOpenCloseAnimator); mOpenCloseAnimator.addListener(new AnimatorListenerAdapter() { @Override @@ -695,6 +745,59 @@ public abstract class ArrowPopup<T extends Context & ActivityContext> mOpenCloseAnimator.start(); } + protected AnimatorSet getMaterialUOpenCloseAnimator(boolean isOpening, int scaleDuration, + int fadeStartDelay, int fadeDuration, int childFadeStartDelay, int childFadeDuration, + Interpolator interpolator) { + + int arrowCenter = mArrowOffsetHorizontal + mArrowWidth / 2; + if (mIsArrowRotated) { + setPivotX(mIsLeftAligned ? 0f : getMeasuredWidth()); + setPivotY(arrowCenter); + } else { + setPivotX(mIsLeftAligned ? arrowCenter : getMeasuredWidth() - arrowCenter); + setPivotY(mIsAboveIcon ? getMeasuredHeight() : 0f); + } + + float[] alphaValues = isOpening ? new float[] {0, 1} : new float[] {1, 0}; + float[] scaleValues = isOpening ? new float[] {0.5f, 1.02f} : new float[] {1f, 0.5f}; + Animator alpha = getAnimatorOfFloat(this, View.ALPHA, fadeDuration, fadeStartDelay, + LINEAR, alphaValues); + Animator arrowAlpha = getAnimatorOfFloat(mArrow, View.ALPHA, fadeDuration, fadeStartDelay, + LINEAR, alphaValues); + Animator scaleY = getAnimatorOfFloat(this, View.SCALE_Y, scaleDuration, 0, interpolator, + scaleValues); + Animator scaleX = getAnimatorOfFloat(this, View.SCALE_X, scaleDuration, 0, interpolator, + scaleValues); + + final AnimatorSet animatorSet = new AnimatorSet(); + if (isOpening) { + float[] scaleValuesOvershoot = new float[] {1.02f, 1f}; + PathInterpolator overshootInterpolator = new PathInterpolator(0.3f, 0, 0.33f, 1f); + Animator overshootY = getAnimatorOfFloat(this, View.SCALE_Y, + OPEN_OVERSHOOT_DURATION_U, scaleDuration, overshootInterpolator, + scaleValuesOvershoot); + Animator overshootX = getAnimatorOfFloat(this, View.SCALE_X, + OPEN_OVERSHOOT_DURATION_U, scaleDuration, overshootInterpolator, + scaleValuesOvershoot); + + animatorSet.playTogether(alpha, arrowAlpha, scaleY, scaleX, overshootX, overshootY); + } else { + animatorSet.playTogether(alpha, arrowAlpha, scaleY, scaleX); + } + + fadeInChildViews(this, alphaValues, childFadeStartDelay, childFadeDuration, animatorSet); + return animatorSet; + } + + private Animator getAnimatorOfFloat(View view, Property<View, Float> property, + int duration, int startDelay, Interpolator interpolator, float... values) { + Animator animator = ObjectAnimator.ofFloat(view, property, values); + animator.setDuration(duration); + animator.setInterpolator(interpolator); + animator.setStartDelay(startDelay); + return animator; + } + /** * Called when creating the open transition allowing subclass can add additional animations. */ |