• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.launcher3;
18 
19 import static com.android.launcher3.LauncherAnimUtils.DRAWABLE_ALPHA;
20 import static com.android.launcher3.LauncherAnimUtils.SCALE_PROPERTY;
21 import static com.android.launcher3.LauncherState.HOTSEAT_ICONS;
22 import static com.android.launcher3.LauncherState.HOTSEAT_SEARCH_BOX;
23 import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_FADE;
24 import static com.android.launcher3.anim.AnimatorSetBuilder.ANIM_WORKSPACE_SCALE;
25 import static com.android.launcher3.anim.Interpolators.LINEAR;
26 import static com.android.launcher3.anim.Interpolators.ZOOM_OUT;
27 import static com.android.launcher3.anim.PropertySetter.NO_ANIM_PROPERTY_SETTER;
28 import static com.android.launcher3.graphics.WorkspaceAndHotseatScrim.SCRIM_PROGRESS;
29 import static com.android.launcher3.graphics.WorkspaceAndHotseatScrim.SYSUI_PROGRESS;
30 
31 import android.view.View;
32 import android.view.animation.Interpolator;
33 
34 import com.android.launcher3.LauncherState.PageAlphaProvider;
35 import com.android.launcher3.LauncherStateManager.AnimationConfig;
36 import com.android.launcher3.anim.AnimatorSetBuilder;
37 import com.android.launcher3.anim.PropertySetter;
38 import com.android.launcher3.graphics.WorkspaceAndHotseatScrim;
39 
40 /**
41  * Manages the animations between each of the workspace states.
42  */
43 public class WorkspaceStateTransitionAnimation {
44 
45     private final Launcher mLauncher;
46     private final Workspace mWorkspace;
47 
48     private float mNewScale;
49 
WorkspaceStateTransitionAnimation(Launcher launcher, Workspace workspace)50     public WorkspaceStateTransitionAnimation(Launcher launcher, Workspace workspace) {
51         mLauncher = launcher;
52         mWorkspace = workspace;
53     }
54 
setState(LauncherState toState)55     public void setState(LauncherState toState) {
56         setWorkspaceProperty(toState, NO_ANIM_PROPERTY_SETTER, new AnimatorSetBuilder(),
57                 new AnimationConfig());
58     }
59 
setStateWithAnimation(LauncherState toState, AnimatorSetBuilder builder, AnimationConfig config)60     public void setStateWithAnimation(LauncherState toState, AnimatorSetBuilder builder,
61             AnimationConfig config) {
62         setWorkspaceProperty(toState, config.getPropertySetter(builder), builder, config);
63     }
64 
getFinalScale()65     public float getFinalScale() {
66         return mNewScale;
67     }
68 
69     /**
70      * Starts a transition animation for the workspace.
71      */
setWorkspaceProperty(LauncherState state, PropertySetter propertySetter, AnimatorSetBuilder builder, AnimationConfig config)72     private void setWorkspaceProperty(LauncherState state, PropertySetter propertySetter,
73             AnimatorSetBuilder builder, AnimationConfig config) {
74         float[] scaleAndTranslation = state.getWorkspaceScaleAndTranslation(mLauncher);
75         mNewScale = scaleAndTranslation[0];
76         PageAlphaProvider pageAlphaProvider = state.getWorkspacePageAlphaProvider(mLauncher);
77         final int childCount = mWorkspace.getChildCount();
78         for (int i = 0; i < childCount; i++) {
79             applyChildState(state, (CellLayout) mWorkspace.getChildAt(i), i, pageAlphaProvider,
80                     propertySetter, builder, config);
81         }
82 
83         int elements = state.getVisibleElements(mLauncher);
84         Interpolator fadeInterpolator = builder.getInterpolator(ANIM_WORKSPACE_FADE,
85                 pageAlphaProvider.interpolator);
86         boolean playAtomicComponent = config.playAtomicComponent();
87         if (playAtomicComponent) {
88             Interpolator scaleInterpolator = builder.getInterpolator(ANIM_WORKSPACE_SCALE, ZOOM_OUT);
89             propertySetter.setFloat(mWorkspace, SCALE_PROPERTY, mNewScale, scaleInterpolator);
90             float hotseatIconsAlpha = (elements & HOTSEAT_ICONS) != 0 ? 1 : 0;
91             propertySetter.setViewAlpha(mLauncher.getHotseat().getLayout(), hotseatIconsAlpha,
92                     fadeInterpolator);
93             propertySetter.setViewAlpha(mLauncher.getWorkspace().getPageIndicator(),
94                     hotseatIconsAlpha, fadeInterpolator);
95         }
96 
97         if (!config.playNonAtomicComponent()) {
98             // Only the alpha and scale, handled above, are included in the atomic animation.
99             return;
100         }
101 
102         Interpolator translationInterpolator = !playAtomicComponent ? LINEAR : ZOOM_OUT;
103         propertySetter.setFloat(mWorkspace, View.TRANSLATION_X,
104                 scaleAndTranslation[1], translationInterpolator);
105         propertySetter.setFloat(mWorkspace, View.TRANSLATION_Y,
106                 scaleAndTranslation[2], translationInterpolator);
107 
108         propertySetter.setViewAlpha(mLauncher.getHotseatSearchBox(),
109                 (elements & HOTSEAT_SEARCH_BOX) != 0 ? 1 : 0, fadeInterpolator);
110 
111         // Set scrim
112         WorkspaceAndHotseatScrim scrim = mLauncher.getDragLayer().getScrim();
113         propertySetter.setFloat(scrim, SCRIM_PROGRESS, state.getWorkspaceScrimAlpha(mLauncher),
114                 LINEAR);
115         propertySetter.setFloat(scrim, SYSUI_PROGRESS, state.hasSysUiScrim ? 1 : 0, LINEAR);
116     }
117 
applyChildState(LauncherState state, CellLayout cl, int childIndex)118     public void applyChildState(LauncherState state, CellLayout cl, int childIndex) {
119         applyChildState(state, cl, childIndex, state.getWorkspacePageAlphaProvider(mLauncher),
120                 NO_ANIM_PROPERTY_SETTER, new AnimatorSetBuilder(), new AnimationConfig());
121     }
122 
applyChildState(LauncherState state, CellLayout cl, int childIndex, PageAlphaProvider pageAlphaProvider, PropertySetter propertySetter, AnimatorSetBuilder builder, AnimationConfig config)123     private void applyChildState(LauncherState state, CellLayout cl, int childIndex,
124             PageAlphaProvider pageAlphaProvider, PropertySetter propertySetter,
125             AnimatorSetBuilder builder, AnimationConfig config) {
126         float pageAlpha = pageAlphaProvider.getPageAlpha(childIndex);
127         int drawableAlpha = Math.round(pageAlpha * (state.hasWorkspacePageBackground ? 255 : 0));
128 
129         if (config.playNonAtomicComponent()) {
130             propertySetter.setInt(cl.getScrimBackground(),
131                     DRAWABLE_ALPHA, drawableAlpha, ZOOM_OUT);
132         }
133         if (config.playAtomicComponent()) {
134             Interpolator fadeInterpolator = builder.getInterpolator(ANIM_WORKSPACE_FADE,
135                     pageAlphaProvider.interpolator);
136             propertySetter.setFloat(cl.getShortcutsAndWidgets(), View.ALPHA,
137                     pageAlpha, fadeInterpolator);
138         }
139     }
140 }