content: package com.rsen.github.easyandroidanimations;
  
  import android.animation.Animator;
  import android.animation.AnimatorListenerAdapter;
  import android.animation.AnimatorSet;
  import android.animation.TimeInterpolator;
  
  import java.util.ArrayList;
  
  /**
   * This class allows multiple Combinable objects to be animated in parallel.
   * 
   * @author SiYao
   * 
   */
  public class ParallelAnimator extends Animation {
  
  	ArrayList<Combinable> combinableList;
  	TimeInterpolator interpolator;
  	long duration;
  	ParallelAnimatorListener listener;
  
  	/**
  	 * This class allows multiple Combinable objects to be animated in parallel.
  	 */
  	public ParallelAnimator() {
  		interpolator = null;
  		duration = 0;
  		combinableList = new ArrayList<Combinable>();
  		listener = null;
  	}
  
  	/**
  	 * This method adds this Combinable object to an ArrayList.
  	 * 
  	 * @param combinable
  	 *            The Animation object that implements the {@link Combinable}
  	 *            interface and is allowed to animate with other animations.
  	 * @return This object, allowing calls to methods in this class to be
  	 *         chained.
  	 */
  	public ParallelAnimator add(Combinable combinable) {
  		combinableList.add(combinable);
  		return this;
  	}
  
  	/**
  	 * This method gets the ArrayList, sets any parameters if needed and plays
  	 * all animations in parallel.
  	 */
  	@Override
  	public void animate() {
  		ArrayList<Animator> animatorList = new ArrayList<Animator>();
  		for (int i = 0; i < combinableList.size(); i++) {
  			if (duration > 0) {
  				combinableList.get(i).setDuration(duration);
  			}
  			animatorList.add(combinableList.get(i).getAnimatorSet());
  		}
  
  		AnimatorSet parallelSet = new AnimatorSet();
  		parallelSet.playTogether(animatorList);
  
  		if (interpolator != null) {
  			parallelSet.setInterpolator(interpolator);
  		}
  
  		parallelSet.addListener(new AnimatorListenerAdapter() {
  
  			@Override
  			public void onAnimationEnd(Animator animation) {
  				if (getListener() != null) {
  					getListener().onAnimationEnd(ParallelAnimator.this);
  				}
  			}
  		});
  		parallelSet.start();
  	}
  
  	/**
  	 * @return The interpolator of the entire parallel animation.
  	 */
  	public TimeInterpolator getInterpolator() {
  		return interpolator;
  	}
  
  	/**
  	 * This method overrides the <code>setInterpolator()</code> methods of all
  	 * the parallel animations.
  	 * 
  	 * @param interpolator
  	 *            The interpolator of the entire parallel animation to set.
  	 */
  	public ParallelAnimator setInterpolator(TimeInterpolator interpolator) {
  		this.interpolator = interpolator;
  		return this;
  	}
  
  	/**
  	 * @return The duration of the entire parallel animation.
  	 */
  	public long getDuration() {
  		return duration;
  	}
  
  	/**
  	 * This method overrides the <code>setDuration()</code> methods of all the
  	 * parallel animations.
  	 * 
  	 * @param duration
  	 *            The duration of the entire parallel animation to set.
  	 */
  	public ParallelAnimator setDuration(long duration) {
  		this.duration = duration;
  		return this;
  	}
  
  	/**
  	 * @return The listener for the end of the parallel animation.
  	 */
  	public ParallelAnimatorListener getListener() {
  		return listener;
  	}
  
  	/**
  	 * @param listener
  	 *            The listener to set for the end of the parallel animation.
  	 */
  	public ParallelAnimator setListener(ParallelAnimatorListener listener) {
  		this.listener = listener;
  		return this;
  	}
  
  }
  