package com.smartisanos.sidebar.util.anim; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import com.smartisanos.sidebar.util.LOG; import java.util.ArrayList; import java.util.List; public class AnimTimeLine { private static final LOG log = LOG.getInstance(AnimTimeLine.class); private static final boolean DBG_ANIM = true; static { if (!DBG_ANIM) {log.close();} } private List<Anim> mAnimList = new ArrayList<Anim>(); private AnimatorSet mAnimationSet = new AnimatorSet(); private AnimListener mListener; private int mStartDelay = 0; public void addAnim(Anim anim) { if (anim == null) { return; } anim.setAnimCallbackListener(); mAnimList.add(anim); } public void addTimeLine(AnimTimeLine timeLine) { if (timeLine == null) { return; } List<Anim> animList = timeLine.getAnimList(); if (animList != null) { timeLine.setAnimCallbackListener(); mAnimList.addAll(animList); } } public List<Anim> getAnimList() { return mAnimList; } public void setAnimCallbackListener() { if (mAnimList == null || mAnimList.size() == 0) { return; } if (mListener == null) { return; } AnimatorCallbackListener listener = new AnimatorCallbackListener(mListener); ObjectAnimator lastAnim = null; long totalTime = 0; for (Anim anim : mAnimList) { List<ObjectAnimator> list = anim.getAnimatorList(); if (list == null) { continue; } for (ObjectAnimator animator : list) { long delta = animator.getDuration() + animator.getStartDelay(); if (delta >= totalTime) { totalTime = delta; lastAnim = animator; } } } if (lastAnim != null) { lastAnim.addListener(listener); } else { log.error("lose last anim, can't set anim listener to time line"); } } public void setDelay(int delay) { mStartDelay = delay; } public boolean start() { if (mAnimList == null || mAnimList.size() == 0) { log.error("time line start, but anim list is null"); LOG.trace(); return false; } List<Animator> animators = new ArrayList<Animator>(); for (Anim anim : mAnimList) { List<ObjectAnimator> list = anim.getAnimatorList(); if (list != null && list.size() > 0) { animators.addAll(list); } } setAnimCallbackListener(); mAnimationSet.playTogether(animators); if (mStartDelay != 0) { mAnimationSet.setStartDelay(mStartDelay); } mAnimationSet.start(); return true; } public void stop() { mAnimationSet.end(); } public void cancel() { mAnimationSet.cancel(); } public boolean started() { return mAnimationSet.isStarted(); } public boolean isRunning() { return mAnimationSet.isRunning(); } public void setAnimListener(AnimListener listener) { if (listener == null) { return; } mListener = listener; } private class AnimatorCallbackListener implements Animator.AnimatorListener { private AnimListener mAnimListener; public AnimatorCallbackListener(AnimListener listener) { mAnimListener = listener; } @Override public void onAnimationStart(Animator animator) { if (mAnimListener != null) { mAnimListener.onStart(); } } @Override public void onAnimationEnd(Animator animator) { if (mAnimListener != null) { mAnimListener.onComplete(Anim.ANIM_FINISH_TYPE_COMPLETE); } } @Override public void onAnimationCancel(Animator animator) { if (mAnimListener != null) { mAnimListener.onComplete(Anim.ANIM_FINISH_TYPE_CANCELED); } } @Override public void onAnimationRepeat(Animator animator) { } } }