mirror of https://github.com/KokaKiwi/BarInsta
206 lines
7.7 KiB
Java
206 lines
7.7 KiB
Java
package awais.instagrabber.customviews.helpers;
|
|
|
|
import android.animation.AnimatorSet;
|
|
import android.animation.ValueAnimator;
|
|
import android.annotation.SuppressLint;
|
|
import android.content.Context;
|
|
import android.os.Handler;
|
|
import android.view.View;
|
|
import android.view.animation.AccelerateDecelerateInterpolator;
|
|
import android.view.animation.AlphaAnimation;
|
|
import android.view.animation.Animation;
|
|
import android.view.animation.TranslateAnimation;
|
|
import android.widget.ImageView;
|
|
|
|
import androidx.appcompat.widget.AppCompatImageView;
|
|
import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat;
|
|
import androidx.vectordrawable.graphics.drawable.AnimatorInflaterCompat;
|
|
|
|
import awais.instagrabber.R;
|
|
import awais.instagrabber.customviews.RecordButton;
|
|
import awais.instagrabber.customviews.RecordView.OnBasketAnimationEnd;
|
|
|
|
import static android.view.View.INVISIBLE;
|
|
import static android.view.View.VISIBLE;
|
|
|
|
public class RecordViewAnimationHelper {
|
|
private static final String TAG = RecordViewAnimationHelper.class.getSimpleName();
|
|
private final Context context;
|
|
private final AnimatedVectorDrawableCompat animatedVectorDrawable;
|
|
private final ImageView basketImg;
|
|
private final ImageView smallBlinkingMic;
|
|
private AlphaAnimation alphaAnimation;
|
|
private OnBasketAnimationEnd onBasketAnimationEndListener;
|
|
private boolean isBasketAnimating;
|
|
private boolean isStartRecorded = false;
|
|
private float micX = 0;
|
|
private float micY = 0;
|
|
private AnimatorSet micAnimation;
|
|
private TranslateAnimation translateAnimation1, translateAnimation2;
|
|
private Handler handler1, handler2;
|
|
|
|
public RecordViewAnimationHelper(Context context, AppCompatImageView basketImg, AppCompatImageView smallBlinkingMic) {
|
|
this.context = context;
|
|
this.smallBlinkingMic = smallBlinkingMic;
|
|
this.basketImg = basketImg;
|
|
animatedVectorDrawable = AnimatedVectorDrawableCompat.create(context, R.drawable.recv_basket_animated);
|
|
}
|
|
|
|
@SuppressLint("RestrictedApi")
|
|
public void animateBasket(float basketInitialY) {
|
|
isBasketAnimating = true;
|
|
|
|
clearAlphaAnimation(false);
|
|
|
|
//save initial x,y values for mic icon
|
|
if (micX == 0) {
|
|
micX = smallBlinkingMic.getX();
|
|
micY = smallBlinkingMic.getY();
|
|
}
|
|
|
|
micAnimation = (AnimatorSet) AnimatorInflaterCompat.loadAnimator(context, R.animator.delete_mic_animation);
|
|
micAnimation.setTarget(smallBlinkingMic); // set the view you want to animate
|
|
|
|
translateAnimation1 = new TranslateAnimation(0, 0, basketInitialY, basketInitialY - 90);
|
|
translateAnimation1.setDuration(250);
|
|
|
|
translateAnimation2 = new TranslateAnimation(0, 0, basketInitialY - 90, basketInitialY);
|
|
translateAnimation2.setDuration(350);
|
|
|
|
micAnimation.start();
|
|
basketImg.setImageDrawable(animatedVectorDrawable);
|
|
|
|
handler1 = new Handler();
|
|
handler1.postDelayed(() -> {
|
|
basketImg.setVisibility(VISIBLE);
|
|
basketImg.startAnimation(translateAnimation1);
|
|
}, 350);
|
|
|
|
translateAnimation1.setAnimationListener(new Animation.AnimationListener() {
|
|
@Override
|
|
public void onAnimationStart(Animation animation) {}
|
|
|
|
@Override
|
|
public void onAnimationEnd(Animation animation) {
|
|
animatedVectorDrawable.start();
|
|
handler2 = new Handler();
|
|
handler2.postDelayed(() -> {
|
|
basketImg.startAnimation(translateAnimation2);
|
|
smallBlinkingMic.setVisibility(INVISIBLE);
|
|
basketImg.setVisibility(INVISIBLE);
|
|
}, 450);
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationRepeat(Animation animation) {}
|
|
});
|
|
|
|
translateAnimation2.setAnimationListener(new Animation.AnimationListener() {
|
|
@Override
|
|
public void onAnimationStart(Animation animation) {}
|
|
|
|
@Override
|
|
public void onAnimationEnd(Animation animation) {
|
|
basketImg.setVisibility(INVISIBLE);
|
|
isBasketAnimating = false;
|
|
//if the user pressed the record button while the animation is running
|
|
// then do NOT call on Animation end
|
|
if (onBasketAnimationEndListener != null && !isStartRecorded) {
|
|
onBasketAnimationEndListener.onAnimationEnd();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onAnimationRepeat(Animation animation) {}
|
|
});
|
|
}
|
|
|
|
//if the user started a new Record while the Animation is running
|
|
// then we want to stop the current animation and revert views back to default state
|
|
public void resetBasketAnimation() {
|
|
if (isBasketAnimating) {
|
|
translateAnimation1.reset();
|
|
translateAnimation1.cancel();
|
|
translateAnimation2.reset();
|
|
translateAnimation2.cancel();
|
|
micAnimation.cancel();
|
|
smallBlinkingMic.clearAnimation();
|
|
basketImg.clearAnimation();
|
|
if (handler1 != null) {
|
|
handler1.removeCallbacksAndMessages(null);
|
|
}
|
|
if (handler2 != null) {
|
|
handler2.removeCallbacksAndMessages(null);
|
|
}
|
|
basketImg.setVisibility(INVISIBLE);
|
|
smallBlinkingMic.setX(micX);
|
|
smallBlinkingMic.setY(micY);
|
|
smallBlinkingMic.setVisibility(View.GONE);
|
|
isBasketAnimating = false;
|
|
}
|
|
}
|
|
|
|
public void clearAlphaAnimation(boolean hideView) {
|
|
if (alphaAnimation != null) {
|
|
alphaAnimation.cancel();
|
|
alphaAnimation.reset();
|
|
}
|
|
smallBlinkingMic.clearAnimation();
|
|
if (hideView) {
|
|
smallBlinkingMic.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
|
|
public void animateSmallMicAlpha() {
|
|
alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
|
|
alphaAnimation.setDuration(500);
|
|
alphaAnimation.setRepeatMode(Animation.REVERSE);
|
|
alphaAnimation.setRepeatCount(Animation.INFINITE);
|
|
smallBlinkingMic.startAnimation(alphaAnimation);
|
|
}
|
|
|
|
public void moveRecordButtonAndSlideToCancelBack(final RecordButton recordBtn, View slideToCancelLayout, float initialX, float difX) {
|
|
final ValueAnimator positionAnimator = ValueAnimator.ofFloat(recordBtn.getX(), initialX);
|
|
positionAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
|
|
positionAnimator.addUpdateListener(animation -> {
|
|
float x = (Float) animation.getAnimatedValue();
|
|
recordBtn.setX(x);
|
|
});
|
|
recordBtn.stopScale();
|
|
positionAnimator.setDuration(200);
|
|
positionAnimator.start();
|
|
|
|
// if the move event was not called ,then the difX will still 0 and there is no need to move it back
|
|
if (difX != 0) {
|
|
float x = initialX - difX;
|
|
slideToCancelLayout.animate()
|
|
.x(x)
|
|
.setDuration(0)
|
|
.start();
|
|
}
|
|
}
|
|
|
|
public void resetSmallMic() {
|
|
smallBlinkingMic.setAlpha(1.0f);
|
|
smallBlinkingMic.setScaleX(1.0f);
|
|
smallBlinkingMic.setScaleY(1.0f);
|
|
}
|
|
|
|
public void setOnBasketAnimationEndListener(OnBasketAnimationEnd onBasketAnimationEndListener) {
|
|
this.onBasketAnimationEndListener = onBasketAnimationEndListener;
|
|
|
|
}
|
|
|
|
public void onAnimationEnd() {
|
|
if (onBasketAnimationEndListener != null) {
|
|
onBasketAnimationEndListener.onAnimationEnd();
|
|
}
|
|
}
|
|
|
|
//check if the user started a new Record by pressing the RecordButton
|
|
public void setStartRecorded(boolean startRecorded) {
|
|
isStartRecorded = startRecorded;
|
|
}
|
|
|
|
}
|