package com.linfaxin.transitionplayer; import android.animation.Animator; import android.animation.TimeInterpolator; import android.animation.ValueAnimator; import android.os.Build; import android.transitions.everywhere.ChangeBounds; import android.transitions.everywhere.Fade; import android.transitions.everywhere.Transition; import android.transitions.everywhere.TransitionSet; import android.transitions.everywhere.TransitionValues; import android.view.ViewGroup; import android.view.animation.LinearInterpolator; import com.linfaxin.transitionplayer.control.PlayControl; import com.linfaxin.transitionplayer.transitions.ChangeAlpha; import com.linfaxin.transitionplayer.transitions.ChangeBackground; import com.linfaxin.transitionplayer.transitions.ChangeRotate; import com.linfaxin.transitionplayer.transitions.ChangeScale; import com.linfaxin.transitionplayer.transitions.ChangeTextColor; import com.linfaxin.transitionplayer.transitions.ChangeTransition; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.LinkedHashMap; /** * Created by linfaxin on 2015/5/27. * Email: linlinfaxin@163.com */ public class TransitionPlayer extends TransitionSet { private LinkedHashMap<Transition, ArrayList<ValueAnimator>> animMap = new LinkedHashMap<>(); private PlayControl playControl; public final ChangeBounds changeBounds = new ChangeBounds(); public final ChangeAlpha changeAlpha = new ChangeAlpha(); public final ChangeRotate changeRotate = new ChangeRotate(); public final ChangeScale changeScale = new ChangeScale(); public final ChangeTransition changeTransition = new ChangeTransition(); public final ChangeBackground changeBackground = new ChangeBackground(); public final ChangeTextColor changeTextColor = new ChangeTextColor(); public final Fade fadeOut = new Fade(Fade.OUT); public final Fade fadeIn = new Fade(Fade.IN); public TransitionPlayer() { setOrdering(TransitionSet.ORDERING_TOGETHER); setDuration(300); addTransition(changeBounds); addTransition(changeAlpha); addTransition(changeRotate); addTransition(changeScale); addTransition(changeTransition); addTransition(changeBackground); addTransition(changeTextColor); addTransition(fadeOut); addTransition(fadeIn); setInterpolator(new LinearInterpolator()); } private void reflectSetupStartEndListeners() { try { Method method = TransitionSet.class.getDeclaredMethod("setupStartEndListeners"); method.setAccessible(true); method.invoke(this); } catch (Exception ignore) { } } @Override public Animator createAnimator(ViewGroup sceneRoot, TransitionValues startValues, TransitionValues endValues) { return null; } @Override protected void runAnimators() { reflectSetupStartEndListeners(); animMap.clear(); for(int i=0, count = getTransitionCount(); i<count; i++){ Transition transition = getTransitionAt(i); ArrayList<ValueAnimator> valueAnimators = new ArrayList<>(); for(Animator animator : AnimatorUtils.collectAnimators(transition)){ valueAnimators.addAll(AnimatorUtils.collectValueAnimators(animator)); } //insure animator's duration, startDelay, Interpolator same as this transition long duration = (long) (getDuration()/ AnimatorUtils.getAnimatorDurationScale()); long startDelay = getStartDelay(); TimeInterpolator interpolator = getInterpolator(); for (ValueAnimator animator : valueAnimators) { if (duration >= 0) animator.setDuration(duration); if (startDelay >= 0) animator.setStartDelay(startDelay + animator.getStartDelay()); if (interpolator != null) animator.setInterpolator(interpolator); } animMap.put(transition, valueAnimators); //you can change transition's duration, startDelay and Interpolator at here if(playControl!=null) playControl.onPreRunAnimator(transition, valueAnimators); } } public ArrayList<ValueAnimator> getAllAnimator(){ ArrayList<ValueAnimator> animators = new ArrayList<>(); for(ArrayList<ValueAnimator> value : animMap.values()){ animators.addAll(value); } return animators; } public void setCurrentFraction(float fraction){ if(Build.VERSION.SDK_INT>Build.VERSION_CODES.LOLLIPOP){ for (ValueAnimator valueAnimator : getAllAnimator()) { valueAnimator.setCurrentFraction(fraction); } }else{ setCurrentPlayTime((long) (fraction * getDuration())); } } public void setCurrentPlayTime(long playTime){ for (ValueAnimator valueAnimator : getAllAnimator()) { playTime -= valueAnimator.getStartDelay(); if(playTime<0) playTime=0; valueAnimator.setCurrentPlayTime(playTime); } } public PlayControl getPlayControl() { return playControl; } public void setPlayControl(PlayControl playControl) { this.playControl = playControl; } }