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.interfaces.Orientation; 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.animation.AccelerateDecelerateInterpolator; /** * Flip to animation, turn from one view to another view * * @author Robin * @since 2015-08-06 15:45:35 * */ public class FlipToAnimation extends AnimationBase<FlipToAnimation>{ public static final int PIVOT_CENTER = 0, PIVOT_LEFT = 1, PIVOT_RIGHT = 2, PIVOT_TOP = 3, PIVOT_BOTTOM = 4; View flipToView; int pivot, direction; float flipAngle; float originalRotation; int orientation = Orientation.HORIZONTAL; /* * ================================================================== * Constructor * ================================================================== */ public FlipToAnimation(View targetView) { this.targetView = targetView; flipToView = null; pivot = PIVOT_CENTER; direction = Direction.DIRECTION_RIGHT; interpolator = new AccelerateDecelerateInterpolator(); duration = Duration.DURATION_LONG; listener = null; } /* * ================================================================== * Override CombinableMethod * ================================================================== */ @Override public void animate() { createAnimatorSet().start(); } @Override public AnimatorSet createAnimatorSet() { ViewHelper.setClipChildren(targetView, false); flipAngle = 270f; if (pivot == PIVOT_CENTER) { flipAngle = 90f; } originalRotation = 0; flipToView.setLayoutParams(targetView.getLayoutParams()); flipToView.setLeft(targetView.getLeft()); flipToView.setTop(targetView.getTop()); flipToView.setVisibility(View.VISIBLE); AnimatorSet flipToAnim = new AnimatorSet(); switch (orientation) { case Orientation.HORIZONTAL: originalRotation = targetView.getRotationY(); if (direction == Direction.DIRECTION_RIGHT) { flipToView.setRotationY(270f); flipToAnim.playSequentially(ObjectAnimator.ofFloat(targetView, View.ROTATION_Y, 0f, flipAngle), ObjectAnimator.ofFloat(flipToView, View.ROTATION_Y, 270f, 360f)); } else { flipToView.setRotationY(-270f); flipToAnim.playSequentially(ObjectAnimator.ofFloat(targetView, View.ROTATION_Y, 0f, -flipAngle), ObjectAnimator.ofFloat(flipToView, View.ROTATION_Y, -270f, -360f)); } break; case Orientation.VERTICAL: originalRotation = targetView.getRotationX(); if (direction == Direction.DIRECTION_UP) { flipToView.setRotationX(270f); flipToAnim.playSequentially(ObjectAnimator.ofFloat(targetView, View.ROTATION_X, 0f, flipAngle), ObjectAnimator.ofFloat(flipToView, View.ROTATION_X, 270f, 360f)); } else { flipToView.setRotationX(-270f); flipToAnim.playSequentially(ObjectAnimator.ofFloat(targetView, View.ROTATION_X, 0f, -flipAngle), ObjectAnimator.ofFloat(flipToView, View.ROTATION_X, -270f, -360f)); } break; } flipToAnim.setInterpolator(interpolator); flipToAnim.setDuration(duration / 2); flipToAnim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { if (listener != null) { listener.onAnimationStart(animation); } } @Override public void onAnimationEnd(Animator animation) { targetView.setVisibility(View.INVISIBLE); switch (orientation) { case Orientation.HORIZONTAL: targetView.setRotationY(originalRotation); break; case Orientation.VERTICAL: targetView.setRotationX(originalRotation); 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 flipToAnim; } @Override public FlipToAnimation setPivotX(int pivotX) { ViewHelper.setPivotX(targetView, pivotX); ViewHelper.setPivotX(flipToView, pivotX); return this; } @Override public FlipToAnimation setPivotY(int pivotY) { ViewHelper.setPivotY(targetView, pivotY); ViewHelper.setPivotY(flipToView, pivotY); return this; } /* * ================================================================== * Getter And Setter * ================================================================== */ public View getFlipToView() { return flipToView; } public FlipToAnimation setFlipToView(View flipToView) { this.flipToView = flipToView; return this; } public int getPivot() { return pivot; } public FlipToAnimation setPivot(int pivot) { this.pivot = pivot; flipAngle = 270f; float pivotX = 0, pivotY = 0, viewWidth = targetView.getWidth(), viewHeight = targetView.getHeight(); switch (orientation) { case Orientation.HORIZONTAL: switch (pivot) { case PIVOT_LEFT: pivotX = 0f; pivotY = viewHeight / 2; break; case PIVOT_RIGHT: pivotX = viewWidth; pivotY = viewHeight / 2; break; default: pivotX = viewWidth / 2; pivotY = viewHeight / 2; flipAngle = 90f; break; } break; case Orientation.VERTICAL: switch (pivot) { case PIVOT_TOP: pivotX = viewWidth / 2; pivotY = 0f; break; case PIVOT_BOTTOM: pivotX = viewWidth / 2; pivotY = viewHeight; break; default: pivotX = viewWidth / 2; pivotY = viewHeight / 2; flipAngle = 90f; break; } break; } ViewHelper.setPivotX(targetView, pivotX); ViewHelper.setPivotY(targetView, pivotY); ViewHelper.setPivotX(flipToView, pivotX); ViewHelper.setPivotY(flipToView, pivotY); return this; } public int getDirection() { return direction; } public FlipToAnimation setDirection(int direction) { this.direction = direction; return this; } public int getOrientation() { return orientation; } public FlipToAnimation setOrientation(int orientation) { this.orientation = orientation; return this; } }