• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2016 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.systemui.statusbar;
18 
19 import android.view.View;
20 
21 import com.android.systemui.Interpolators;
22 import com.android.systemui.statusbar.stack.StackStateAnimator;
23 
24 /**
25  * A helper to fade views in and out.
26  */
27 public class CrossFadeHelper {
28     public static final long ANIMATION_DURATION_LENGTH = 210;
29 
fadeOut(final View view, final Runnable endRunnable)30     public static void fadeOut(final View view, final Runnable endRunnable) {
31         view.animate().cancel();
32         view.animate()
33                 .alpha(0f)
34                 .setDuration(ANIMATION_DURATION_LENGTH)
35                 .setInterpolator(Interpolators.ALPHA_OUT)
36                 .withEndAction(new Runnable() {
37                     @Override
38                     public void run() {
39                         if (endRunnable != null) {
40                             endRunnable.run();
41                         }
42                         view.setVisibility(View.INVISIBLE);
43                     }
44                 });
45         if (view.hasOverlappingRendering()) {
46             view.animate().withLayer();
47         }
48     }
49 
fadeOut(View view, float fadeOutAmount)50     public static void fadeOut(View view, float fadeOutAmount) {
51         fadeOut(view, fadeOutAmount, true /* remap */);
52     }
53 
54     /**
55      * Fade out a view by a given progress amount
56      * @param view the view to fade out
57      * @param fadeOutAmount how much the view is faded out. 0 means not at all and 1 means fully
58      *                      faded out
59      * @param remap whether the fade amount should be remapped to the shorter duration
60      * {@link #ANIMATION_DURATION_LENGTH} from the normal fade duration
61      * {@link StackStateAnimator#ANIMATION_DURATION_STANDARD} in order to have a faster fading.
62      *
63      * @see #fadeIn(View, float, boolean)
64      */
fadeOut(View view, float fadeOutAmount, boolean remap)65     public static void fadeOut(View view, float fadeOutAmount, boolean remap) {
66         view.animate().cancel();
67         if (fadeOutAmount == 1.0f) {
68             view.setVisibility(View.INVISIBLE);
69         } else if (view.getVisibility() == View.INVISIBLE) {
70             view.setVisibility(View.VISIBLE);
71         }
72         if (remap) {
73             fadeOutAmount = mapToFadeDuration(fadeOutAmount);
74         }
75         float alpha = Interpolators.ALPHA_OUT.getInterpolation(1.0f - fadeOutAmount);
76         view.setAlpha(alpha);
77         updateLayerType(view, alpha);
78     }
79 
mapToFadeDuration(float fadeOutAmount)80     private static float mapToFadeDuration(float fadeOutAmount) {
81         // Assuming a linear interpolator, we can easily map it to our new duration
82         float endPoint = (float) ANIMATION_DURATION_LENGTH
83                 / (float) StackStateAnimator.ANIMATION_DURATION_STANDARD;
84         return Math.min(fadeOutAmount / endPoint, 1.0f);
85     }
86 
updateLayerType(View view, float alpha)87     private static void updateLayerType(View view, float alpha) {
88         if (view.hasOverlappingRendering() && alpha > 0.0f && alpha < 1.0f) {
89             view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
90         } else if (view.getLayerType() == View.LAYER_TYPE_HARDWARE) {
91             view.setLayerType(View.LAYER_TYPE_NONE, null);
92         }
93     }
94 
fadeIn(final View view)95     public static void fadeIn(final View view) {
96         view.animate().cancel();
97         if (view.getVisibility() == View.INVISIBLE) {
98             view.setAlpha(0.0f);
99             view.setVisibility(View.VISIBLE);
100         }
101         view.animate()
102                 .alpha(1f)
103                 .setDuration(ANIMATION_DURATION_LENGTH)
104                 .setInterpolator(Interpolators.ALPHA_IN)
105                 .withEndAction(null);
106         if (view.hasOverlappingRendering()) {
107             view.animate().withLayer();
108         }
109     }
110 
fadeIn(View view, float fadeInAmount)111     public static void fadeIn(View view, float fadeInAmount) {
112         fadeIn(view, fadeInAmount, true /* remap */);
113     }
114 
115     /**
116      * Fade in a view by a given progress amount
117      * @param view the view to fade in
118      * @param fadeInAmount how much the view is faded in. 0 means not at all and 1 means fully
119      *                     faded in.
120      * @param remap whether the fade amount should be remapped to the shorter duration
121      * {@link #ANIMATION_DURATION_LENGTH} from the normal fade duration
122      * {@link StackStateAnimator#ANIMATION_DURATION_STANDARD} in order to have a faster fading.
123      *
124      * @see #fadeOut(View, float, boolean)
125      */
fadeIn(View view, float fadeInAmount, boolean remap)126     public static void fadeIn(View view, float fadeInAmount, boolean remap) {
127         view.animate().cancel();
128         if (view.getVisibility() == View.INVISIBLE) {
129             view.setVisibility(View.VISIBLE);
130         }
131         if (remap) {
132             fadeInAmount = mapToFadeDuration(fadeInAmount);
133         }
134         float alpha = Interpolators.ALPHA_IN.getInterpolation(fadeInAmount);
135         view.setAlpha(alpha);
136         updateLayerType(view, alpha);
137     }
138 }
139