package com.eleks.tesla.mainApp; import android.animation.Animator; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.view.View; import android.view.animation.LinearInterpolator; import android.widget.FrameLayout; import android.widget.ImageView; /** * Created by Ihor.Demedyuk on 06.03.2015. */ public final class AnimationUtils { private static final int START_ANIMATION_TIME = 67; private static final int MIDDLE_ANIMATION_TIME = 182; private static final int END_ANIMATION_TIME = 56; private static final float START_ANIMATION_OUT_SCALE_END = 0.71f; private static final float MIDDLE_ANIMATION_OUT_SCALE_START = 0.71f; private static final float MIDDLE_ANIMATION_OUT_SCALE_END = 1.19f; private static final float MIDDLE_ANIMATION_IN_ALPHA_START = 0f; private static final float MIDDLE_ANIMATION_IN_ALPHA_END = 0.45f; private static final float END_ANIMATION_IN_SCALE_START = 1.28f; private static final float END_ANIMATION_IN_SCALE_END = 1f; private static final float END_ANIMATION_IN_ALPHA_START = 0.45f; private static final float END_ANIMATION_IN_ALPHA_END = 1f; public static final int IMAGE_RESOURCE_UNDEFINED = -1; public static void performActionAnimation(View view, int viewSideSize) { performToggleAnimation(view, viewSideSize, IMAGE_RESOURCE_UNDEFINED); } private static int getImageSizeFromCoef(float coef, int viewSideSize) { return Math.round(viewSideSize * coef); } private static class ScaleAnimateListener implements ValueAnimator.AnimatorUpdateListener { private View mView; private ScaleAnimateListener(View view) { mView = view; } @Override public void onAnimationUpdate(ValueAnimator animation) { setViewSize(mView, (int) animation.getAnimatedValue()); } } private static class AlphaAnimateListener implements ValueAnimator.AnimatorUpdateListener { private View mView; private AlphaAnimateListener(View view) { mView = view; } @Override public void onAnimationUpdate(ValueAnimator animation) { mView.setAlpha((float) animation.getAnimatedValue()); } } private static void setViewSize(View view, int size) { FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) view.getLayoutParams(); params.width = size; params.height = size; view.setLayoutParams(params); view.requestLayout(); } public static void performToggleAnimation(final View view, int viewSideSize, final int imageResource) { ValueAnimator startAnim = ValueAnimator.ofInt(viewSideSize, getImageSizeFromCoef(START_ANIMATION_OUT_SCALE_END, viewSideSize)); startAnim.addUpdateListener(new ScaleAnimateListener(view)); startAnim.setDuration(START_ANIMATION_TIME); AnimatorSet middleAnim = new AnimatorSet(); ValueAnimator middleOutScale = ValueAnimator.ofInt(getImageSizeFromCoef(MIDDLE_ANIMATION_OUT_SCALE_START, viewSideSize), getImageSizeFromCoef(MIDDLE_ANIMATION_OUT_SCALE_END, viewSideSize)); middleOutScale.addUpdateListener(new ScaleAnimateListener(view)); ValueAnimator middleInAlpha = ValueAnimator.ofFloat(MIDDLE_ANIMATION_IN_ALPHA_START, MIDDLE_ANIMATION_IN_ALPHA_END); middleInAlpha.addUpdateListener(new AlphaAnimateListener(view)); middleAnim.playTogether(middleOutScale, middleInAlpha); middleAnim.setDuration(MIDDLE_ANIMATION_TIME); if (IMAGE_RESOURCE_UNDEFINED != imageResource && view instanceof ImageView) { middleInAlpha.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { ((ImageView) view).setImageResource(imageResource); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); } AnimatorSet endAnim = new AnimatorSet(); ValueAnimator endInScale = ValueAnimator.ofInt(getImageSizeFromCoef(END_ANIMATION_IN_SCALE_START, viewSideSize), getImageSizeFromCoef(END_ANIMATION_IN_SCALE_END, viewSideSize)); endInScale.addUpdateListener(new ScaleAnimateListener(view)); ValueAnimator endInAlpha = ValueAnimator.ofFloat(END_ANIMATION_IN_ALPHA_START, END_ANIMATION_IN_ALPHA_END); endInAlpha.addUpdateListener(new AlphaAnimateListener(view)); endAnim.playTogether(endInScale, endInAlpha); endAnim.setDuration(END_ANIMATION_TIME); AnimatorSet mainAnim = new AnimatorSet(); mainAnim.playSequentially(startAnim, middleAnim, endAnim); mainAnim.setInterpolator(new LinearInterpolator()); mainAnim.start(); } }