Skip to content

Instantly share code, notes, and snippets.

@yoalex5
Created April 19, 2019 08:21
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yoalex5/3b9f69e90f35a04ce2da44fc304020da to your computer and use it in GitHub Desktop.
Save yoalex5/3b9f69e90f35a04ce2da44fc304020da to your computer and use it in GitHub Desktop.
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.support.annotation.DrawableRes;
import android.view.View;
import android.widget.ImageView;
import timber.log.Timber;
public class CardAnimationHelper {
public static final String PROPERTY_ROTATION_Y = "rotationY";
private static final int QUARTER_ANIM_DURATION = 500;
private static final int QUARTER_ANIM_INDEX_1 = 0;
private static final int QUARTER_ANIM_INDEX_2 = 1;
private static final int QUARTER_ANIM_INDEX_3 = 2;
private static final int QUARTER_ANIM_INDEX_4 = 3;
private static final int QUARTER_ROTATE = 90;
private static final int QUARTER_FROM_1 = 0;
private static final int QUARTER_TO_1 = 90;
private static final int QUARTER_FROM_2 = QUARTER_TO_1;
private static final int QUARTER_TO_2 = 180;
private static final int QUARTER_FROM_3 = QUARTER_TO_2;
private static final int QUARTER_TO_3 = QUARTER_TO_1;
private static final int QUARTER_FROM_4 = QUARTER_TO_3;
private static final int QUARTER_TO_4 = QUARTER_FROM_1;
private final ImageView mImageView;
@DrawableRes
private final int mResIdFrontCard;
@DrawableRes
private final int mResIdBackCard;
private long mQuarterCurrentAnimPlayTime;
private int mQuarterCurrentAnimStartIndex;
private AnimatorSet mAnimatorSet;
private ObjectAnimator mQuarterAnim1;
private ObjectAnimator mQuarterAnim2;
private ObjectAnimator mQuarterAnim3;
private ObjectAnimator mQuarterAnim4;
public CardAnimationHelper(ImageView imageView,
@DrawableRes int resIdFrontCard,
@DrawableRes int resIdBackCard) {
mImageView = imageView;
mResIdFrontCard = resIdFrontCard;
mResIdBackCard = resIdBackCard;
setupDistance();
setupAnimators();
}
public void flipCard() {
// Set the layer type to hardware
mImageView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
if (mAnimatorSet != null) {
mAnimatorSet.cancel();
}
mAnimatorSet = new AnimatorSet();
if (mQuarterCurrentAnimPlayTime == 0) {
//No animation
if (mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_1
|| mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_4) {
mAnimatorSet.play(mQuarterAnim1).before(mQuarterAnim2);
} else if (mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_2) {
mAnimatorSet.play(mQuarterAnim3).before(mQuarterAnim4);
}
} else {
//cancel anim
restoreDefaultAnimValues();
long degreeDelta = mQuarterCurrentAnimPlayTime * QUARTER_ROTATE / QUARTER_ANIM_DURATION;
if (mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_1) {
mQuarterAnim4.setFloatValues(degreeDelta, QUARTER_FROM_1);
mQuarterAnim4.setDuration(mQuarterCurrentAnimPlayTime);
mAnimatorSet.play(mQuarterAnim4);
} else if (mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_2) {
mQuarterAnim3.setFloatValues(QUARTER_FROM_2 + degreeDelta, QUARTER_FROM_2);
mQuarterAnim3.setDuration(mQuarterCurrentAnimPlayTime);
mAnimatorSet.play(mQuarterAnim3).before(mQuarterAnim4);
} else if (mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_3) {
mQuarterAnim2.setFloatValues(QUARTER_FROM_3 - degreeDelta, QUARTER_FROM_3);
mQuarterAnim2.setDuration(mQuarterCurrentAnimPlayTime);
mAnimatorSet.play(mQuarterAnim2);
} else if (mQuarterCurrentAnimStartIndex == QUARTER_ANIM_INDEX_4) {
mQuarterAnim1.setFloatValues(QUARTER_FROM_4 - degreeDelta, QUARTER_FROM_4);
mQuarterAnim1.setDuration(mQuarterCurrentAnimPlayTime);
mAnimatorSet.play(mQuarterAnim1).before(mQuarterAnim2);
}
mQuarterCurrentAnimPlayTime = 0;
}
mAnimatorSet.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
Timber.d(" ");
mImageView.setLayerType(View.LAYER_TYPE_NONE, null);
}
});
mAnimatorSet.start();
}
public void destroy() {
if (mAnimatorSet != null) {
mAnimatorSet.removeAllListeners();
mAnimatorSet.cancel();
}
if (mQuarterAnim1 != null) {
mQuarterAnim1.cancel();
}
if (mQuarterAnim2 != null) {
mQuarterAnim2.cancel();
}
if (mQuarterAnim3 != null) {
mQuarterAnim3.cancel();
}
if (mQuarterAnim4 != null) {
mQuarterAnim4.cancel();
}
}
//--
private void setupDistance() {
int distance = 8000;
float scale = mImageView.getContext().getResources().getDisplayMetrics().density * distance;
mImageView.setCameraDistance(scale);
}
private void setupAnimators() {
mQuarterAnim1 = ObjectAnimator.ofFloat(mImageView, PROPERTY_ROTATION_Y, QUARTER_FROM_1,
QUARTER_TO_1)
.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim1.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mQuarterCurrentAnimStartIndex = QUARTER_ANIM_INDEX_1;
mImageView.setImageResource(mResIdFrontCard);
}
@Override
public void onAnimationCancel(Animator animation) {
mQuarterCurrentAnimPlayTime = ((ObjectAnimator) animation).getCurrentPlayTime();
}
});
mQuarterAnim2 = ObjectAnimator.ofFloat(mImageView, PROPERTY_ROTATION_Y, QUARTER_FROM_2,
QUARTER_TO_2)
.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim2.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mQuarterCurrentAnimStartIndex = QUARTER_ANIM_INDEX_2;
mImageView.setImageResource(mResIdBackCard);
}
@Override
public void onAnimationCancel(Animator animation) {
mQuarterCurrentAnimPlayTime = ((ObjectAnimator) animation).getCurrentPlayTime();
}
});
mQuarterAnim3 = ObjectAnimator.ofFloat(mImageView, PROPERTY_ROTATION_Y, QUARTER_FROM_3,
QUARTER_TO_3)
.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim3.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mQuarterCurrentAnimStartIndex = QUARTER_ANIM_INDEX_3;
mImageView.setImageResource(mResIdBackCard);
}
@Override
public void onAnimationCancel(Animator animation) {
mQuarterCurrentAnimPlayTime = ((ObjectAnimator) animation).getCurrentPlayTime();
}
});
mQuarterAnim4 = ObjectAnimator.ofFloat(mImageView, PROPERTY_ROTATION_Y, QUARTER_FROM_4,
QUARTER_TO_4)
.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim4.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationStart(Animator animation) {
mQuarterCurrentAnimStartIndex = QUARTER_ANIM_INDEX_4;
mImageView.setImageResource(mResIdFrontCard);
}
@Override
public void onAnimationCancel(Animator animation) {
mQuarterCurrentAnimPlayTime = ((ObjectAnimator) animation).getCurrentPlayTime();
}
});
}
private void restoreDefaultAnimValues() {
mQuarterAnim1.setFloatValues(QUARTER_FROM_1, QUARTER_TO_1);
mQuarterAnim1.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim2.setFloatValues(QUARTER_FROM_2, QUARTER_TO_2);
mQuarterAnim2.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim3.setFloatValues(QUARTER_FROM_3, QUARTER_TO_3);
mQuarterAnim3.setDuration(QUARTER_ANIM_DURATION);
mQuarterAnim4.setFloatValues(QUARTER_FROM_4, QUARTER_TO_4);
mQuarterAnim4.setDuration(QUARTER_ANIM_DURATION);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment