Home | History | Annotate | Download | only in launcher3
      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.view.View;
     25 import android.view.ViewAnimationUtils;
     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 
     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
     56     public static void startAnimationAfterNextDraw(final Animator animator, final View view) {
     57         view.getViewTreeObserver().addOnDrawListener(new ViewTreeObserver.OnDrawListener() {
     58                 private boolean mStarted = false;
     59                 public void onDraw() {
     60                     if (mStarted) return;
     61                     mStarted = true;
     62                     // Use this as a signal that the animation was cancelled
     63                     if (animator.getDuration() == 0) {
     64                         return;
     65                     }
     66                     animator.start();
     67 
     68                     final ViewTreeObserver.OnDrawListener listener = this;
     69                     view.post(new Runnable() {
     70                             public void run() {
     71                                 view.getViewTreeObserver().removeOnDrawListener(listener);
     72                             }
     73                         });
     74                 }
     75             });
     76     }
     77 
     78     public static void onDestroyActivity() {
     79         HashSet<Animator> animators = new HashSet<Animator>(sAnimators.keySet());
     80         for (Animator a : animators) {
     81             if (a.isRunning()) {
     82                 a.cancel();
     83             }
     84             sAnimators.remove(a);
     85         }
     86     }
     87 
     88     public static AnimatorSet createAnimatorSet() {
     89         AnimatorSet anim = new AnimatorSet();
     90         cancelOnDestroyActivity(anim);
     91         return anim;
     92     }
     93 
     94     public static ValueAnimator ofFloat(View target, float... values) {
     95         ValueAnimator anim = new ValueAnimator();
     96         anim.setFloatValues(values);
     97         cancelOnDestroyActivity(anim);
     98         return anim;
     99     }
    100 
    101     public static ObjectAnimator ofFloat(View target, String propertyName, float... values) {
    102         ObjectAnimator anim = new ObjectAnimator();
    103         anim.setTarget(target);
    104         anim.setPropertyName(propertyName);
    105         anim.setFloatValues(values);
    106         cancelOnDestroyActivity(anim);
    107         new FirstFrameAnimatorHelper(anim, target);
    108         return anim;
    109     }
    110 
    111     public static ObjectAnimator ofPropertyValuesHolder(View target,
    112             PropertyValuesHolder... values) {
    113         ObjectAnimator anim = new ObjectAnimator();
    114         anim.setTarget(target);
    115         anim.setValues(values);
    116         cancelOnDestroyActivity(anim);
    117         new FirstFrameAnimatorHelper(anim, target);
    118         return anim;
    119     }
    120 
    121     public static ObjectAnimator ofPropertyValuesHolder(Object target,
    122             View view, PropertyValuesHolder... values) {
    123         ObjectAnimator anim = new ObjectAnimator();
    124         anim.setTarget(target);
    125         anim.setValues(values);
    126         cancelOnDestroyActivity(anim);
    127         new FirstFrameAnimatorHelper(anim, view);
    128         return anim;
    129     }
    130 
    131     public static Animator createCircularReveal(View view, int centerX,
    132             int centerY, float startRadius, float endRadius) {
    133         Animator anim = ViewAnimationUtils.createCircularReveal(view, centerX,
    134                 centerY, startRadius, endRadius);
    135         if (anim instanceof ValueAnimator) {
    136             new FirstFrameAnimatorHelper((ValueAnimator) anim, view);
    137         }
    138         return anim;
    139     }
    140 }
    141