• 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         view.animate().cancel();
52         if (fadeOutAmount == 1.0f) {
53             view.setVisibility(View.INVISIBLE);
54         } else if (view.getVisibility() == View.INVISIBLE) {
55             view.setVisibility(View.VISIBLE);
56         }
57         fadeOutAmount = mapToFadeDuration(fadeOutAmount);
58         float alpha = Interpolators.ALPHA_OUT.getInterpolation(1.0f - fadeOutAmount);
59         view.setAlpha(alpha);
60         updateLayerType(view, alpha);
61     }
62 
mapToFadeDuration(float fadeOutAmount)63     private static float mapToFadeDuration(float fadeOutAmount) {
64         // Assuming a linear interpolator, we can easily map it to our new duration
65         float endPoint = (float) ANIMATION_DURATION_LENGTH
66                 / (float) StackStateAnimator.ANIMATION_DURATION_STANDARD;
67         return Math.min(fadeOutAmount / endPoint, 1.0f);
68     }
69 
updateLayerType(View view, float alpha)70     private static void updateLayerType(View view, float alpha) {
71         if (view.hasOverlappingRendering() && alpha > 0.0f && alpha < 1.0f) {
72             view.setLayerType(View.LAYER_TYPE_HARDWARE, null);
73         } else if (view.getLayerType() == View.LAYER_TYPE_HARDWARE) {
74             view.setLayerType(View.LAYER_TYPE_NONE, null);
75         }
76     }
77 
fadeIn(final View view)78     public static void fadeIn(final View view) {
79         view.animate().cancel();
80         if (view.getVisibility() == View.INVISIBLE) {
81             view.setAlpha(0.0f);
82             view.setVisibility(View.VISIBLE);
83         }
84         view.animate()
85                 .alpha(1f)
86                 .setDuration(ANIMATION_DURATION_LENGTH)
87                 .setInterpolator(Interpolators.ALPHA_IN)
88                 .withEndAction(null);
89         if (view.hasOverlappingRendering()) {
90             view.animate().withLayer();
91         }
92     }
93 
fadeIn(View view, float fadeInAmount)94     public static void fadeIn(View view, float fadeInAmount) {
95         view.animate().cancel();
96         if (view.getVisibility() == View.INVISIBLE) {
97             view.setVisibility(View.VISIBLE);
98         }
99         fadeInAmount = mapToFadeDuration(fadeInAmount);
100         float alpha = Interpolators.ALPHA_IN.getInterpolation(fadeInAmount);
101         view.setAlpha(alpha);
102         updateLayerType(view, alpha);
103     }
104 }
105