Created
April 19, 2019 08:21
-
-
Save yoalex5/3b9f69e90f35a04ce2da44fc304020da to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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