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