From 59c6901823180bdeb6c39187df45fd1adddeae2d Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Tue, 18 Jun 2019 16:34:37 -0700 Subject: Some improvements to home to overview transition for 0 button mode - Peek in overview further, and with more overshoot - Fade out and scale down workspace faster while swiping up - Scale and translate workspace slower when letting go to enter overview (so it doesn't zoom out at warp speed) - Fade in all apps shelf sooner Bug: 132455160 Change-Id: Ieafad0ccf9bb587889bc35d536627661db10e358 --- src/com/android/launcher3/LauncherState.java | 53 +++++++++++++++++- .../android/launcher3/LauncherStateManager.java | 62 ++-------------------- .../WorkspaceStateTransitionAnimation.java | 13 +++-- .../android/launcher3/anim/AnimatorSetBuilder.java | 12 +++-- 4 files changed, 72 insertions(+), 68 deletions(-) (limited to 'src') diff --git a/src/com/android/launcher3/LauncherState.java b/src/com/android/launcher3/LauncherState.java index 148064889..dcfd272b4 100644 --- a/src/com/android/launcher3/LauncherState.java +++ b/src/com/android/launcher3/LauncherState.java @@ -17,7 +17,18 @@ package com.android.launcher3; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_AUTO; import static android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS; +import static android.view.View.VISIBLE; import static android.view.accessibility.AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED; + +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_TRANSLATE_X; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_FADE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_SCALE; +import static com.android.launcher3.anim.Interpolators.ACCEL; +import static com.android.launcher3.anim.Interpolators.DEACCEL; +import static com.android.launcher3.anim.Interpolators.DEACCEL_1_7; +import static com.android.launcher3.anim.Interpolators.clampToProgress; import static com.android.launcher3.testing.TestProtocol.ALL_APPS_STATE_ORDINAL; import static com.android.launcher3.testing.TestProtocol.BACKGROUND_APP_STATE_ORDINAL; import static com.android.launcher3.testing.TestProtocol.NORMAL_STATE_ORDINAL; @@ -30,11 +41,11 @@ import static com.android.launcher3.states.RotationHelper.REQUEST_NONE; import android.view.animation.Interpolator; +import com.android.launcher3.anim.AnimatorSetBuilder; import com.android.launcher3.states.SpringLoadedState; import com.android.launcher3.uioverrides.UiFactory; import com.android.launcher3.uioverrides.states.AllAppsState; import com.android.launcher3.uioverrides.states.OverviewState; -import com.android.launcher3.userevent.nano.LauncherLogProto.Action; import com.android.launcher3.userevent.nano.LauncherLogProto.ContainerType; import java.util.Arrays; @@ -272,6 +283,46 @@ public class LauncherState { } } + /** + * Prepares for a non-user controlled animation from fromState to this state. Preparations + * include: + * - Setting interpolators for various animations included in the state transition. + * - Setting some start values (e.g. scale) for views that are hidden but about to be shown. + */ + public void prepareForAtomicAnimation(Launcher launcher, LauncherState fromState, + AnimatorSetBuilder builder) { + if (this == NORMAL && fromState == OVERVIEW) { + builder.setInterpolator(ANIM_WORKSPACE_SCALE, DEACCEL); + builder.setInterpolator(ANIM_WORKSPACE_FADE, ACCEL); + builder.setInterpolator(ANIM_OVERVIEW_SCALE, clampToProgress(ACCEL, 0, 0.9f)); + builder.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, ACCEL); + builder.setInterpolator(ANIM_OVERVIEW_FADE, DEACCEL_1_7); + Workspace workspace = launcher.getWorkspace(); + + // Start from a higher workspace scale, but only if we're invisible so we don't jump. + boolean isWorkspaceVisible = workspace.getVisibility() == VISIBLE; + if (isWorkspaceVisible) { + CellLayout currentChild = (CellLayout) workspace.getChildAt( + workspace.getCurrentPage()); + isWorkspaceVisible = currentChild.getVisibility() == VISIBLE + && currentChild.getShortcutsAndWidgets().getAlpha() > 0; + } + if (!isWorkspaceVisible) { + workspace.setScaleX(0.92f); + workspace.setScaleY(0.92f); + } + Hotseat hotseat = launcher.getHotseat(); + boolean isHotseatVisible = hotseat.getVisibility() == VISIBLE && hotseat.getAlpha() > 0; + if (!isHotseatVisible) { + hotseat.setScaleX(0.92f); + hotseat.setScaleY(0.92f); + } + } else if (this == NORMAL && fromState == OVERVIEW_PEEK) { + // Keep fully visible until the very end (when overview is offscreen) to make invisible. + builder.setInterpolator(ANIM_OVERVIEW_FADE, t -> t < 1 ? 0 : 1); + } + } + protected static void dispatchWindowStateChanged(Launcher launcher) { launcher.getWindow().getDecorView().sendAccessibilityEvent(TYPE_WINDOW_STATE_CHANGED); } diff --git a/src/com/android/launcher3/LauncherStateManager.java b/src/com/android/launcher3/LauncherStateManager.java index 4425e2af6..505918e09 100644 --- a/src/com/android/launcher3/LauncherStateManager.java +++ b/src/com/android/launcher3/LauncherStateManager.java @@ -16,23 +16,7 @@ package com.android.launcher3; -import static android.view.View.VISIBLE; - import static com.android.launcher3.LauncherState.NORMAL; -import static com.android.launcher3.LauncherState.OVERVIEW; -import static com.android.launcher3.LauncherState.OVERVIEW_PEEK; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_FADE; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_SCALE; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_OVERVIEW_TRANSLATE_X; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_FADE; -import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_SCALE; -import static com.android.launcher3.anim.Interpolators.ACCEL; -import static com.android.launcher3.anim.Interpolators.DEACCEL; -import static com.android.launcher3.anim.Interpolators.DEACCEL_1_7; -import static com.android.launcher3.anim.Interpolators.INSTANT; -import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_2; -import static com.android.launcher3.anim.Interpolators.OVERSHOOT_1_7; -import static com.android.launcher3.anim.Interpolators.clampToProgress; import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER; import android.animation.Animator; @@ -42,8 +26,6 @@ import android.os.Handler; import android.os.Looper; import android.util.Log; -import androidx.annotation.IntDef; - import com.android.launcher3.anim.AnimationSuccessListener; import com.android.launcher3.anim.AnimatorPlaybackController; import com.android.launcher3.anim.AnimatorSetBuilder; @@ -58,6 +40,8 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; +import androidx.annotation.IntDef; + /** * TODO: figure out what kind of tests we can write for this * @@ -314,47 +298,7 @@ public class LauncherStateManager { */ public void prepareForAtomicAnimation(LauncherState fromState, LauncherState toState, AnimatorSetBuilder builder) { - if (fromState == NORMAL && toState == OVERVIEW) { - builder.setInterpolator(ANIM_WORKSPACE_SCALE, OVERSHOOT_1_2); - builder.setInterpolator(ANIM_WORKSPACE_FADE, OVERSHOOT_1_2); - builder.setInterpolator(ANIM_OVERVIEW_SCALE, OVERSHOOT_1_2); - builder.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, OVERSHOOT_1_7); - builder.setInterpolator(ANIM_OVERVIEW_FADE, OVERSHOOT_1_2); - - // Start from a higher overview scale, but only if we're invisible so we don't jump. - UiFactory.prepareToShowOverview(mLauncher); - } else if (fromState == OVERVIEW && toState == NORMAL) { - builder.setInterpolator(ANIM_WORKSPACE_SCALE, DEACCEL); - builder.setInterpolator(ANIM_WORKSPACE_FADE, ACCEL); - builder.setInterpolator(ANIM_OVERVIEW_SCALE, clampToProgress(ACCEL, 0, 0.9f)); - builder.setInterpolator(ANIM_OVERVIEW_TRANSLATE_X, ACCEL); - builder.setInterpolator(ANIM_OVERVIEW_FADE, DEACCEL_1_7); - Workspace workspace = mLauncher.getWorkspace(); - - // Start from a higher workspace scale, but only if we're invisible so we don't jump. - boolean isWorkspaceVisible = workspace.getVisibility() == VISIBLE; - if (isWorkspaceVisible) { - CellLayout currentChild = (CellLayout) workspace.getChildAt( - workspace.getCurrentPage()); - isWorkspaceVisible = currentChild.getVisibility() == VISIBLE - && currentChild.getShortcutsAndWidgets().getAlpha() > 0; - } - if (!isWorkspaceVisible) { - workspace.setScaleX(0.92f); - workspace.setScaleY(0.92f); - } - Hotseat hotseat = workspace.getHotseat(); - boolean isHotseatVisible = hotseat.getVisibility() == VISIBLE && hotseat.getAlpha() > 0; - if (!isHotseatVisible) { - hotseat.setScaleX(0.92f); - hotseat.setScaleY(0.92f); - } - } else if (fromState == NORMAL && toState == OVERVIEW_PEEK) { - builder.setInterpolator(ANIM_OVERVIEW_FADE, INSTANT); - } else if (fromState == OVERVIEW_PEEK && toState == NORMAL) { - // Keep fully visible until the very end (when overview is offscreen) to make invisible. - builder.setInterpolator(ANIM_OVERVIEW_FADE, t -> t < 1 ? 0 : 1); - } + toState.prepareForAtomicAnimation(mLauncher, fromState, builder); } public AnimatorSet createAtomicAnimation(LauncherState fromState, LauncherState toState, diff --git a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java index 065d06568..40c6b5f1b 100644 --- a/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java +++ b/src/com/android/launcher3/WorkspaceStateTransitionAnimation.java @@ -19,6 +19,8 @@ package com.android.launcher3; import static com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA; import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY; import static com.android.launcher3.LauncherState.HOTSEAT_ICONS; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_HOTSEAT_SCALE; +import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_HOTSEAT_TRANSLATE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_FADE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_SCALE; import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_TRANSLATE; @@ -104,7 +106,10 @@ public class WorkspaceStateTransitionAnimation { hotseat.setPivotY(workspacePivot[1]); } float hotseatScale = hotseatScaleAndTranslation.scale; - propertySetter.setFloat(hotseat, SCALE_PROPERTY, hotseatScale, scaleInterpolator); + Interpolator hotseatScaleInterpolator = builder.getInterpolator(ANIM_HOTSEAT_SCALE, + scaleInterpolator); + propertySetter.setFloat(hotseat, SCALE_PROPERTY, hotseatScale, + hotseatScaleInterpolator); float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0; propertySetter.setViewAlpha(hotseat, hotseatIconsAlpha, fadeInterpolator); @@ -125,10 +130,12 @@ public class WorkspaceStateTransitionAnimation { propertySetter.setFloat(mWorkspace, View.TRANSLATION_Y, scaleAndTranslation.translationY, translationInterpolator); + Interpolator hotseatTranslationInterpolator = builder.getInterpolator( + ANIM_HOTSEAT_TRANSLATE, translationInterpolator); propertySetter.setFloat(hotseat, View.TRANSLATION_Y, - hotseatScaleAndTranslation.translationY, translationInterpolator); + hotseatScaleAndTranslation.translationY, hotseatTranslationInterpolator); propertySetter.setFloat(mWorkspace.getPageIndicator(), View.TRANSLATION_Y, - hotseatScaleAndTranslation.translationY, translationInterpolator); + hotseatScaleAndTranslation.translationY, hotseatTranslationInterpolator); setScrim(propertySetter, state); } diff --git a/src/com/android/launcher3/anim/AnimatorSetBuilder.java b/src/com/android/launcher3/anim/AnimatorSetBuilder.java index 5c498f8bb..52a896eda 100644 --- a/src/com/android/launcher3/anim/AnimatorSetBuilder.java +++ b/src/com/android/launcher3/anim/AnimatorSetBuilder.java @@ -32,11 +32,13 @@ public class AnimatorSetBuilder { public static final int ANIM_WORKSPACE_SCALE = 1; public static final int ANIM_WORKSPACE_TRANSLATE = 2; public static final int ANIM_WORKSPACE_FADE = 3; - public static final int ANIM_OVERVIEW_SCALE = 4; - public static final int ANIM_OVERVIEW_TRANSLATE_X = 5; - public static final int ANIM_OVERVIEW_TRANSLATE_Y = 6; - public static final int ANIM_OVERVIEW_FADE = 7; - public static final int ANIM_ALL_APPS_FADE = 8; + public static final int ANIM_HOTSEAT_SCALE = 4; + public static final int ANIM_HOTSEAT_TRANSLATE = 5; + public static final int ANIM_OVERVIEW_SCALE = 6; + public static final int ANIM_OVERVIEW_TRANSLATE_X = 7; + public static final int ANIM_OVERVIEW_TRANSLATE_Y = 8; + public static final int ANIM_OVERVIEW_FADE = 9; + public static final int ANIM_ALL_APPS_FADE = 10; public static final int FLAG_DONT_ANIMATE_OVERVIEW = 1 << 0; -- cgit v1.2.3