2 * Copyright (C) 2012 The Android Open Source Project
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package com.android.launcher3;
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.ViewGroup;
27 import android.view.ViewTreeObserver;
28 import android.widget.ViewAnimator;
30 import java.util.HashSet;
31 import java.util.WeakHashMap;
33 public class LauncherAnimUtils {
34 static WeakHashMap<Animator, Object> sAnimators = new WeakHashMap<Animator, Object>();
35 static Animator.AnimatorListener sEndAnimListener = new Animator.AnimatorListener() {
36 public void onAnimationStart(Animator animation) {
37 sAnimators.put(animation, null);
40 public void onAnimationRepeat(Animator animation) {
43 public void onAnimationEnd(Animator animation) {
44 sAnimators.remove(animation);
47 public void onAnimationCancel(Animator animation) {
48 sAnimators.remove(animation);
52 public static void cancelOnDestroyActivity(Animator a) {
53 a.addListener(sEndAnimListener);
56 // Helper method. Assumes a draw is pending, and that if the animation's duration is 0
57 // it should be cancelled
58 public static void startAnimationAfterNextDraw(final Animator animator, final View view) {
59 view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
60 private boolean mStarted = false;
62 public void onDraw() {
65 // Use this as a signal that the animation was cancelled
66 if (animator.getDuration() == 0) {
71 final ViewTreeObserver.OnDrawListener listener = this;
72 view.post(new Runnable() {
74 view.getViewTreeObserver().removeOnDrawListener(listener);
81 public static void onDestroyActivity() {
82 HashSet<Animator> animators = new HashSet<Animator>(sAnimators.keySet());
83 for (Animator a : animators) {
91 public static AnimatorSet createAnimatorSet() {
92 AnimatorSet anim = new AnimatorSet();
93 cancelOnDestroyActivity(anim);
97 public static ValueAnimator ofFloat(View target, float... values) {
98 ValueAnimator anim = new ValueAnimator();
99 anim.setFloatValues(values);
100 cancelOnDestroyActivity(anim);
104 public static ObjectAnimator ofFloat(View target, Property<View, Float> property,
106 ObjectAnimator anim = ObjectAnimator.ofFloat(target, property, values);
107 cancelOnDestroyActivity(anim);
108 new FirstFrameAnimatorHelper(anim, target);
112 public static ObjectAnimator ofViewAlphaAndScale(View target,
113 float alpha, float scaleX, float scaleY) {
114 return ofPropertyValuesHolder(target,
115 PropertyValuesHolder.ofFloat(View.ALPHA, alpha),
116 PropertyValuesHolder.ofFloat(View.SCALE_X, scaleX),
117 PropertyValuesHolder.ofFloat(View.SCALE_Y, scaleY));
120 public static ObjectAnimator ofPropertyValuesHolder(View target,
121 PropertyValuesHolder... values) {
122 return ofPropertyValuesHolder(target, target, values);
125 public static ObjectAnimator ofPropertyValuesHolder(Object target,
126 View view, PropertyValuesHolder... values) {
127 ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(target, values);
128 cancelOnDestroyActivity(anim);
129 new FirstFrameAnimatorHelper(anim, view);
133 public static ValueAnimator animateViewHeight(final View v, int fromHeight, int toHeight) {
134 ValueAnimator anim = ValueAnimator.ofInt(fromHeight, toHeight);
135 anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
137 public void onAnimationUpdate(ValueAnimator valueAnimator) {
138 int val = (Integer) valueAnimator.getAnimatedValue();
139 ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
140 layoutParams.height = val;
141 v.setLayoutParams(layoutParams);