2

I am trying to animate the image using scale and rotate properties. I am able to start the animation. But how to do the reverse one from the animated position instead of the actual position of the image.

AnimatorSet animation = new AnimatorSet();
private void rotateImage(boolean isReverse) {
        if(isReverse){
            animation.playTogether(
                    ObjectAnimator.ofFloat(fingerPrintImage, "rotation", 0, 60),
                    ObjectAnimator.ofFloat(fingerPrintImage, "scaleX", 1, 0.5f),
                    ObjectAnimator.ofFloat(fingerPrintImage, "scaleY", 1, 0.5f)
            );
        }
       else {
            animation.playTogether(
                    ObjectAnimator.ofFloat(fingerPrintImage, "rotation", 0, 60),
                    ObjectAnimator.ofFloat(fingerPrintImage, "scaleX", 1, 1.3f),
                    ObjectAnimator.ofFloat(fingerPrintImage, "scaleY", 1, 1.3f)
            );
        }
        animation.setDuration(5000);
        animation.start();
    }

rotateImage(true);
A Honey Bustard
  • 3,433
  • 2
  • 22
  • 38
Balasubramanian
  • 5,274
  • 6
  • 33
  • 62
  • I think you can reverse `AnimationSet` . Something like [this](https://stackoverflow.com/questions/33025396/reverse-animatorset) . I am not sure but Give it a try anyway. – ADM Jan 20 '21 at 08:54

1 Answers1

1

Usually reversing your 'from' and 'to' float parameters f.e. :

ObjectAnimator.ofFloat(fingerPrintImage, "scaleX", 1, 1.3f) // forward

ObjectAnimator.ofFloat(fingerPrintImage, "scaleX", 1.3f, 1) //backward

gives you an backward effect.

For animations like this, I strongly recommend ViewPropertyAnimator. It is super concise and has less code, no need for AnimationSets (which are often buggy), and you can chain different animations in one line :

private void rotateImage(boolean isReverse) {
    if(isReverse){
       fingerPrintImage.animate().rotationBy(-60).scaleXBy(0.3f).scaleYBy(0.3f).setDuration(5000);
    } else {
       fingerPrintImage.animate().rotationBy(60).scaleXBy(-0.3f).scaleYBy(-0.3f).setDuration(5000);
}

Maybe you have to tweak your values a bit, but this should be all you need.

Even shorter and more dynamic would be passing all float values through function parameters :

private void rotateImage(View view, float rotate, float scaleY, float scaleX, long duration) {
    view.animate().rotationBy(rotate).scaleXBy(scaleX).scaleYBy(scaleY).setDuration(duration);
}

which then can be called like :

rotateImage(fingerPrintImage, 60, 0.3f, 0,3f, 5000); // forward
rotateImage(fingerPrintImage, 60, -0.3f, -0.3f, 5000) //backwards

this minimizes code, gets rid of the isReverse boolean, and you are also able to reuse the method with different parameters for further animations.

A Honey Bustard
  • 3,433
  • 2
  • 22
  • 38