• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 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 android.animation.Animator;
20 import android.animation.AnimatorSet;
21 import android.animation.ObjectAnimator;
22 import android.animation.PropertyValuesHolder;
23 import android.animation.ValueAnimator;
24 import android.util.Property;
25 import android.view.View;
26 import android.view.ViewTreeObserver;
27 
28 import java.util.HashSet;
29 import java.util.WeakHashMap;
30 
31 public class LauncherAnimUtils {
32     static WeakHashMap<Animator, Object> sAnimators = new WeakHashMap<Animator, Object>();
33     static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() {
34         public void onAnimationStart(Animator animation) {
35             sAnimators.put(animation, null);
36         }
37 
38         public void onAnimationRepeat(Animator animation) {
39         }
40 
41         public void onAnimationEnd(Animator animation) {
42             sAnimators.remove(animation);
43         }
44 
45         public void onAnimationCancel(Animator animation) {
46             sAnimators.remove(animation);
47         }
48     };
49 
cancelOnDestroyActivity(Animator a)50     public static void cancelOnDestroyActivity(Animator a) {
51         a.addListener(sEndAnimListener);
52     }
53 
54     // Helper method. Assumes a draw is pending, and that if the animation's duration is 0
55     // it should be cancelled
startAnimationAfterNextDraw(final Animator animator, final View view)56     public static void startAnimationAfterNextDraw(final Animator animator, final View view) {
57         view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
58             private boolean mStarted = false;
59 
60             public void onDraw() {
61                 if (mStarted) return;
62                 mStarted = true;
63                 // Use this as a signal that the animation was cancelled
64                 if (animator.getDuration() == 0) {
65                     return;
66                 }
67                 animator.start();
68 
69                 final ViewTreeObserver.OnDrawListener listener = this;
70                 view.post(new Runnable() {
71                     public void run() {
72                         view.getViewTreeObserver().removeOnDrawListener(listener);
73                     }
74                 });
75             }
76         });
77     }
78 
onDestroyActivity()79     public static void onDestroyActivity() {
80         HashSet<Animator> animators = new HashSet<Animator>(sAnimators.keySet());
81         for (Animator a : animators) {
82             if (a.isRunning()) {
83                 a.cancel();
84             }
85             sAnimators.remove(a);
86         }
87     }
88 
createAnimatorSet()89     public static AnimatorSet createAnimatorSet() {
90         AnimatorSet anim = new AnimatorSet();
91         cancelOnDestroyActivity(anim);
92         return anim;
93     }
94 
ofFloat(View target, float... values)95     public static ValueAnimator ofFloat(View target, float... values) {
96         ValueAnimator anim = new ValueAnimator();
97         anim.setFloatValues(values);
98         cancelOnDestroyActivity(anim);
99         return anim;
100     }
101 
ofFloat(View target, Property<View, Float> property, float... values)102     public static ObjectAnimator ofFloat(View target, Property<View, Float> property,
103             float... values) {
104         ObjectAnimator anim = ObjectAnimator.ofFloat(target, property, values);
105         cancelOnDestroyActivity(anim);
106         new FirstFrameAnimatorHelper(anim, target);
107         return anim;
108     }
109 
ofViewAlphaAndScale(View target, float alpha, float scaleX, float scaleY)110     public static ObjectAnimator ofViewAlphaAndScale(View target,
111             float alpha, float scaleX, float scaleY) {
112         return ofPropertyValuesHolder(target,
113                 PropertyValuesHolder.ofFloat(View.ALPHA, alpha),
114                 PropertyValuesHolder.ofFloat(View.SCALE_X, scaleX),
115                 PropertyValuesHolder.ofFloat(View.SCALE_Y, scaleY));
116     }
117 
ofPropertyValuesHolder(View target, PropertyValuesHolder... values)118     public static ObjectAnimator ofPropertyValuesHolder(View target,
119             PropertyValuesHolder... values) {
120         return ofPropertyValuesHolder(target, target, values);
121     }
122 
ofPropertyValuesHolder(Object target, View view, PropertyValuesHolder... values)123     public static ObjectAnimator ofPropertyValuesHolder(Object target,
124             View view, PropertyValuesHolder... values) {
125         ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(target, values);
126         cancelOnDestroyActivity(anim);
127         new FirstFrameAnimatorHelper(anim, view);
128         return anim;
129     }
130 }
131