package com.xdroid.animation.anim; import com.xdroid.animation.base.AnimationBase; import com.xdroid.animation.interfaces.Direction; import com.xdroid.animation.interfaces.Duration; import com.xdroid.animation.utils.ViewHelper; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; /** * Slide Underneath animation,this animation causes the view to slide in underneath from its own borders. * * @author Robin * @since 2015-07-31 11:39:08 * */ public class SlideUnderneathAnimation extends AnimationBase<SlideUnderneathAnimation>{ int direction; int slideMode = SlideMode.IN; ObjectAnimator slideAnim; /** * Slide animation mode, to enter or exit * * @author Robin * */ public interface SlideMode { public static final int IN = 0x01, OUT = 0x02; } /* * ================================================================== * Constructor * ================================================================== */ public SlideUnderneathAnimation(View targetView) { this.targetView = targetView; direction = Direction.DIRECTION_LEFT; interpolator = new AccelerateDecelerateInterpolator(); duration = Duration.DURATION_LONG; listener = null; slideAnim = null; } /* * ================================================================== * Override CombinableMethod * ================================================================== */ @Override public void animate() { createAnimatorSet().start(); } @Override public AnimatorSet createAnimatorSet() { ViewHelper.setClipChildren(targetView, true); final ViewGroup parentView = (ViewGroup) targetView.getParent(); final FrameLayout slideFrame = new FrameLayout(targetView.getContext()); final int positionView = parentView.indexOfChild(targetView); slideFrame.setLayoutParams(targetView.getLayoutParams()); slideFrame.setClipChildren(true); parentView.removeView(targetView); slideFrame.addView(targetView); parentView.addView(slideFrame, positionView); switch (slideMode) { case SlideMode.IN: switch (direction) { case Direction.DIRECTION_LEFT: targetView.setTranslationX(-targetView.getWidth()); slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_X, slideFrame.getX()); break; case Direction.DIRECTION_RIGHT: targetView.setTranslationX(targetView.getWidth()); slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_X, slideFrame.getX()); break; case Direction.DIRECTION_UP: targetView.setTranslationY(-targetView.getHeight()); slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_Y, slideFrame.getY()); break; case Direction.DIRECTION_DOWN: targetView.setTranslationY(targetView.getHeight()); slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_Y, slideFrame.getY()); break; default: break; } break; case SlideMode.OUT: switch (direction) { case Direction.DIRECTION_LEFT: slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_X, targetView.getTranslationX() - targetView.getWidth()); break; case Direction.DIRECTION_RIGHT: slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_X, targetView.getTranslationX() + targetView.getWidth()); break; case Direction.DIRECTION_UP: slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_Y, targetView.getTranslationY() - targetView.getHeight()); break; case Direction.DIRECTION_DOWN: slideAnim = ObjectAnimator.ofFloat(targetView, View.TRANSLATION_Y, targetView.getTranslationY() + targetView.getHeight()); break; default: break; } break; } AnimatorSet slideSet = new AnimatorSet(); slideSet.play(slideAnim); slideSet.setInterpolator(interpolator); slideSet.setDuration(duration); slideAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { switch (slideMode) { case SlideMode.IN: targetView.setVisibility(View.VISIBLE); break; case SlideMode.OUT: break; } if (listener != null) { listener.onAnimationStart(animation); } } @Override public void onAnimationEnd(Animator animation) { switch (slideMode) { case SlideMode.IN: slideFrame.removeAllViews(); parentView.removeView(slideFrame); targetView.setLayoutParams(slideFrame.getLayoutParams()); parentView.addView(targetView, positionView); break; case SlideMode.OUT: targetView.setVisibility(View.INVISIBLE); //slideAnim.reverse(); slideFrame.removeAllViews(); parentView.removeView(slideFrame); targetView.setLayoutParams(slideFrame.getLayoutParams()); parentView.addView(targetView, positionView); break; } if (listener != null) { listener.onAnimationEnd(animation); } } @Override public void onAnimationCancel(Animator animation) { if (listener != null) { listener.onAnimationCancel(animation); } } @Override public void onAnimationRepeat(Animator animation) { if (listener != null) { listener.onAnimationRepeat(animation); } } }); return slideSet; } /* * ================================================================== * Getter And Setter * ================================================================== */ public SlideUnderneathAnimation setDirection(int direction) { this.direction = direction; return this; } public int getSlideMode() { return slideMode; } public SlideUnderneathAnimation setSlideMode(int slideMode) { this.slideMode = slideMode; return this; } }