content: package com.rsen.github.easyandroidanimations;
  
  import android.animation.Animator;
  import android.animation.AnimatorListenerAdapter;
  import android.animation.TimeInterpolator;
  import android.graphics.Color;
  import android.view.View;
  import android.view.ViewGroup;
  import android.view.ViewGroup.LayoutParams;
  import android.view.animation.AccelerateDecelerateInterpolator;
  import android.widget.FrameLayout;
  import android.widget.ImageView;
  
  /**
   * This animation makes use of a translucent box to overlay the view before
   * animating its alpha property to mimic the highlighting of the view.
   * 
   * @author SiYao
   * 
   */
  public class HighlightAnimation extends Animation {
  
  	int color;
  	TimeInterpolator interpolator;
  	long duration;
  	AnimationListener listener;
  
  	/**
  	 * This animation makes use of a translucent box to overlay the view before
  	 * animating its alpha property to mimic the highlighting of the view.
  	 * 
  	 * @param color
  	 *            the color of the highlight
  	 * @param duration
  	 *            the duration of the entire animation
  	 * @param listener
  	 *            the AnimationListener of animation @see
  	 *            {@link AnimationListener}
  	 */
  	public HighlightAnimation(View view) {
  		this.view = view;
  		color = Color.YELLOW;
  		interpolator = new AccelerateDecelerateInterpolator();
  		duration = DURATION_LONG;
  		listener = null;
  	}
  
  	@Override
  	public void animate() {
  		final FrameLayout highlightFrame = new FrameLayout(view.getContext());
  		LayoutParams layoutParams = new LayoutParams(view.getWidth(),
  				view.getHeight());
  		ImageView highlightView = new ImageView(view.getContext());
  		highlightView.setBackgroundColor(color);
  		highlightView.setAlpha(0.5f);
  		highlightView.setVisibility(View.VISIBLE);
  
  		final ViewGroup parentView = (ViewGroup) view.getParent();
  		final int positionView = parentView.indexOfChild(view);
  		parentView.addView(highlightFrame, positionView, layoutParams);
  		highlightFrame.setX(view.getLeft());
  		highlightFrame.setY(view.getTop());
  		parentView.removeView(view);
  		highlightFrame.addView(view);
  		highlightFrame.addView(highlightView);
  
  		highlightView.animate().alpha(0).setInterpolator(interpolator)
  				.setDuration(duration)
  				.setListener(new AnimatorListenerAdapter() {
  
  					@Override
  					public void onAnimationEnd(Animator animation) {
  						highlightFrame.removeAllViews();
  						parentView.addView(view, positionView);
  						view.setX(highlightFrame.getLeft());
  						view.setY(highlightFrame.getTop());
  						parentView.removeView(highlightFrame);
  						if (getListener() != null) {
  							getListener().onAnimationEnd(
  									HighlightAnimation.this);
  						}
  					}
  				});
  	}
  
  	/**
  	 * @return The color of the highlight.
  	 * @see android.graphics.Color
  	 */
  	public int getColor() {
  		return color;
  	}
  
  	/**
  	 * @param color
  	 *            The color of the highlight to set.
  	 * @return This object, allowing calls to methods in this class to be
  	 *         chained.
  	 * @see android.graphics.Color
  	 */
  	public HighlightAnimation setColor(int color) {
  		this.color = color;
  		return this;
  	}
  
  	/**
  	 * @return The interpolator of the entire animation.
  	 */
  	public TimeInterpolator getInterpolator() {
  		return interpolator;
  	}
  
  	/**
  	 * @param interpolator
  	 *            The interpolator of the entire animation to set.
  	 */
  	public HighlightAnimation setInterpolator(TimeInterpolator interpolator) {
  		this.interpolator = interpolator;
  		return this;
  	}
  
  	/**
  	 * @return The duration of the entire animation.
  	 */
  	public long getDuration() {
  		return duration;
  	}
  
  	/**
  	 * @param duration
  	 *            The duration of the entire animation to set.
  	 * @return This object, allowing calls to methods in this class to be
  	 *         chained.
  	 */
  	public HighlightAnimation setDuration(long duration) {
  		this.duration = duration;
  		return this;
  	}
  
  	/**
  	 * @return The listener for the end of the animation.
  	 */
  	public AnimationListener getListener() {
  		return listener;
  	}
  
  	/**
  	 * @param listener
  	 *            The listener to set for the end of the animation.
  	 * @return This object, allowing calls to methods in this class to be
  	 *         chained.
  	 */
  	public HighlightAnimation setListener(AnimationListener listener) {
  		this.listener = listener;
  		return this;
  	}
  
  }
  