package com.marshalchen.common.uimodule.easyandroidanimations;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.TimeInterpolator;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.FrameLayout;
/**
* This animation hides the view by scaling its Y property to mimic the
* "pulling of blinds". On animation end, the view is restored to its original
* state and is set to <code>View.INVISIBLE</code>.
*
* @author Phu
*
*/
public class BlindAnimation extends Animation {
TimeInterpolator interpolator;
long duration;
AnimationListener listener;
/**
* This animation hides the view by scaling its Y property to mimic the
* "pulling of blinds". 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 BlindAnimation(View view) {
this.view = view;
interpolator = new AccelerateDecelerateInterpolator();
duration = DURATION_LONG;
listener = null;
}
@Override
public void animate() {
final ViewGroup parent = (ViewGroup) view.getParent(), animationLayout = new FrameLayout(view.getContext());
final int positionView = parent.indexOfChild(view);
animationLayout.setLayoutParams(view.getLayoutParams());
parent.removeView(view);
animationLayout.addView(view);
parent.addView(animationLayout, positionView);
final float originalScaleY = view.getScaleY();
ObjectAnimator scaleY = ObjectAnimator.ofFloat(animationLayout,
View.SCALE_Y, 0f), scaleY_child = ObjectAnimator.ofFloat(view,
View.SCALE_Y, 2.5f);
animationLayout.setPivotX(1f);
animationLayout.setPivotY(1f);
view.setPivotX(1f);
view.setPivotY(1f);
AnimatorSet blindAnimationSet = new AnimatorSet();
blindAnimationSet.playTogether(scaleY, scaleY_child);
blindAnimationSet.setInterpolator(interpolator);
blindAnimationSet.setDuration(duration / 2);
blindAnimationSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.INVISIBLE);
view.setScaleY(originalScaleY);
animationLayout.removeAllViews();
parent.removeView(animationLayout);
parent.addView(view, positionView);
if (getListener() != null) {
getListener().onAnimationEnd(BlindAnimation.this);
}
}
});
blindAnimationSet.start();
}
/**
* @return The interpolator of the entire animation.
*/
public TimeInterpolator getInterpolator() {
return interpolator;
}
/**
* @param interpolator
* The interpolator of the entire animation to set.
*/
public BlindAnimation 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 BlindAnimation 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 BlindAnimation setListener(AnimationListener listener) {
this.listener = listener;
return this;
}
}