package com.linfaxin.transitionplayer; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.annotation.TargetApi; import android.os.Build; import android.transitions.everywhere.Transition; import android.transitions.everywhere.TransitionSet; import com.linfaxin.transitionplayer.interpolators.ReverseTimeInterpolator; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; /** * Created by linfaxin on 2015/8/8. * Email: linlinfaxin@163.com */ public class AnimatorUtils { public static List<ValueAnimator> splitAnimatorByValues(ValueAnimator animator){ ArrayList<ValueAnimator> animators = new ArrayList<>(); PropertyValuesHolder[] valuesHolders = animator.getValues(); if(valuesHolders!=null && valuesHolders.length>0){ for(PropertyValuesHolder valuesHolder : valuesHolders){ ValueAnimator clone = animator.clone(); if(clone instanceof ObjectAnimator){ ((ObjectAnimator) clone).setPropertyName(valuesHolder.getPropertyName()); } clone.setValues(valuesHolder); animators.add(clone); } }else{ animators.add(animator); } return animators; } public static float getAnimatorDurationScale() { try { Method method = ValueAnimator.class.getDeclaredMethod("getDurationScale"); method.setAccessible(true); float scale = ((Float) method.invoke(ValueAnimator.class)).floatValue(); if(scale<=0){ method = ValueAnimator.class.getDeclaredMethod("setDurationScale", float.class); method.setAccessible(true); method.invoke(ValueAnimator.class, 1); return 1; } return scale; } catch (Exception ignore) { } return 1; } public static List<ValueAnimator> collectValueAnimators(Animator animator){ ArrayList<ValueAnimator> valueAnimators = new ArrayList<ValueAnimator>(); for(Animator anim : collectAnimators(animator)){ if(anim instanceof ValueAnimator){ valueAnimators.add((ValueAnimator) anim); } } return valueAnimators; } public static List<Animator> collectAnimators(Animator animator){ if(animator instanceof AnimatorSet){ return collectAnimatorsFromSet((AnimatorSet) animator); }else{ ArrayList<Animator> animators = new ArrayList<Animator>(); animators.add(animator); return animators; } } @TargetApi(Build.VERSION_CODES.HONEYCOMB) public static List<Animator> collectAnimatorsFromSet(AnimatorSet animatorSet){ ArrayList<Animator> animators = new ArrayList<Animator>(); for(Animator animator : animatorSet.getChildAnimations()){ animators.addAll(collectAnimators(animator)); } return animators; } public static List<Animator> collectAnimators(Transition transition){ if(transition instanceof TransitionSet){ return collectAnimatorsFromSet((TransitionSet) transition); } return collectAnimatorsFromTransition(transition); } private static List<Animator> collectAnimatorsFromSet(TransitionSet transitionSet){ ArrayList<Animator> animators = new ArrayList<Animator>(); for(int i=0, count = transitionSet.getTransitionCount(); i<count; i++){ animators.addAll(collectAnimators(transitionSet.getTransitionAt(i))); } return animators; } private static List<Animator> collectAnimatorsFromTransition(Transition transition){ try { Field field = Transition.class.getDeclaredField("mAnimators"); field.setAccessible(true); return (List<Animator>) field.get(transition); } catch (Exception e) { e.printStackTrace(); } return new ArrayList<Animator>(); } public static void reverseAnimator(Animator animator){ if(animator instanceof ValueAnimator){ animator.setInterpolator(new ReverseTimeInterpolator(((ValueAnimator)animator).getInterpolator())); }else if(Build.VERSION.SDK_INT>=18){ animator.setInterpolator(new ReverseTimeInterpolator(animator.getInterpolator())); } } }