package com.marshalchen.common.uimodule.easyandroidanimations;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AccelerateDecelerateInterpolator;
import com.marshalchen.common.uimodule.easyandroidanimations.FoldLayout.Orientation;
/**
* This animation folds out the view for a customizable number of folds,
* orientation and at a customizable anchor factor. On animation end, the view
* is restored to its original state and is set to <code>View.INVISIBLE</code>.
*
* @author SiYao
*
*/
public class FoldAnimation extends Animation {
private final int ANTIALIAS_PADDING = 1;
int numOfFolds;
Orientation orientation;
float anchorFactor;
TimeInterpolator interpolator;
long duration;
AnimationListener listener;
/**
* This animation folds out the view for a customizable number of folds,
* orientation and at a customizable anchor factor. On animation end, the
* view is restored to its original state and is set to
* <code>View.INVISIBLE</code>.
*
* @param view
* The view to be animated.
*/
public FoldAnimation(View view) {
this.view = view;
numOfFolds = 1;
orientation = Orientation.HORIZONTAL;
anchorFactor = 0f;
interpolator = new AccelerateDecelerateInterpolator();
duration = DURATION_LONG;
listener = null;
}
@Override
public void animate() {
final ViewGroup parentView = (ViewGroup) view.getParent();
final int positionView = parentView.indexOfChild(view);
final FoldLayout mFoldLayout = new FoldLayout(view.getContext());
mFoldLayout.setLayoutParams(new LayoutParams(view.getWidth(), view
.getHeight()));
mFoldLayout.setX(view.getLeft());
mFoldLayout.setY(view.getTop());
parentView.removeView(view);
parentView.addView(mFoldLayout, positionView);
mFoldLayout.addView(view);
view.setPadding(ANTIALIAS_PADDING, ANTIALIAS_PADDING,
ANTIALIAS_PADDING, ANTIALIAS_PADDING);
mFoldLayout.setNumberOfFolds(numOfFolds);
mFoldLayout.setOrientation(orientation);
mFoldLayout.setAnchorFactor(anchorFactor);
ObjectAnimator foldAnim = ObjectAnimator.ofFloat(mFoldLayout,
"foldFactor", 0, 1);
foldAnim.setDuration(duration);
foldAnim.setInterpolator(interpolator);
foldAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.INVISIBLE);
mFoldLayout.removeAllViews();
parentView.removeView(mFoldLayout);
parentView.addView(view, positionView);
if (getListener() != null) {
getListener().onAnimationEnd(FoldAnimation.this);
}
}
});
foldAnim.start();
}
/**
* @return The number of folds.
*/
public int getNumOfFolds() {
return numOfFolds;
}
/**
* @param numOfFolds
* The number of folds to set.
* @return This object, allowing calls to methods in this class to be
* chained.
*/
public FoldAnimation setNumOfFolds(int numOfFolds) {
this.numOfFolds = numOfFolds;
return this;
}
/**
* The available orientations are <code>Orientation.HORIZONTAL</code> and
* <code>Orientation.VERTICAL</code>.
*
* @return The orientation of the fold.
*/
public Orientation getOrientation() {
return orientation;
}
/**
* The available orientations are <code>Orientation.HORIZONTAL</code> and
* <code>Orientation.VERTICAL</code>.
*
* @param orientation
* The orientation of the fold to set.
* @return This object, allowing calls to methods in this class to be
* chained.
*/
public FoldAnimation setOrientation(Orientation orientation) {
this.orientation = orientation;
return this;
}
/**
* The available anchor factors range from 0 to 1. For example, in order to
* anchor the fold at the top, the anchor factor should be 0.
*
* @return The anchor factor of the fold.
*/
public float getAnchorFactor() {
return anchorFactor;
}
/**
* The available anchor factors range from 0 to 1. For example, in order to
* anchor the fold at the top, the anchor factor should be 0.
*
* @param anchorFactor
* The anchor factor of the fold to set.
* @return This object, allowing calls to methods in this class to be
* chained.
*/
public FoldAnimation setAnchorFactor(float anchorFactor) {
this.anchorFactor = anchorFactor;
return this;
}
/**
* @return The interpolator of the entire animation.
*/
public TimeInterpolator getInterpolator() {
return interpolator;
}
/**
* @param interpolator
* The interpolator of the entire animation to set.
* @return This object, allowing calls to methods in this class to be
* chained.
*/
public FoldAnimation 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 FoldAnimation 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 FoldAnimation setListener(AnimationListener listener) {
this.listener = listener;
return this;
}
}