How to reset ObjectAnimator to it's initial status?
Asked Answered
E

3

16

I want to vibrate a view with scaleX and scaleY, and I am doing it with this code, but the problem is that sometimes the view is not correctly reset, and it shows with the scale applied...

I want that when the animation ends, the view must be seen with its original status always

this is the code:

                ObjectAnimator scaleX = ObjectAnimator.ofFloat(view, "scaleX", 1f, 0.9f);
                scaleX.setDuration(50);
                scaleX.setRepeatCount(5);
                scaleX.setRepeatMode(Animation.REVERSE);
                ObjectAnimator scaleY = ObjectAnimator.ofFloat(view, "scaleY", 1f, 0.9f);
                scaleY.setDuration(50);     
                scaleY.setRepeatCount(5);
                scaleY.setRepeatMode(Animation.REVERSE);
                set.play(scaleX).with(scaleY);
                set.start();

Thanks

Epaulet answered 23/12, 2014 at 8:12 Comment(0)
P
18

For ValueAnimator and ObjectAnimator can be like this a try:

animator.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        animation.removeListener(this);
        animation.setDuration(0);
        ((ValueAnimator) animation).reverse();
    }
});

UPDATE On Android 7 it doesn't work. Best way use the interpolator.

public class ReverseInterpolator implements Interpolator {

    private final Interpolator delegate;

    public ReverseInterpolator(Interpolator delegate){
        this.delegate = delegate;
    }

    public ReverseInterpolator(){
        this(new LinearInterpolator());
    }

    @Override
    public float getInterpolation(float input) {
        return 1 - delegate.getInterpolation(input);
    }
}

In your code

animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            animation.removeListener(this);
            animation.setDuration(0);
            animation.setInterpolator(new ReverseInterpolator());
            animation.start();
        }
});
Permafrost answered 28/5, 2016 at 19:42 Comment(3)
Why do you need animation.removeListener(this);?Lax
@DavidChen Because after .reverse(), onAnimationEnd() will be invoked againPermafrost
In my test this solution created an endless vibration instead of stopping it and returning to the original size. Is there possibly a bug?Varsity
V
3

According to the docs(Property Animation):

The property animation system can animate Views on the screen by changing the actual properties in the View objects. In addition, Views also automatically call the invalidate() method to refresh the screen whenever its properties are changed.

so you can use AnimatorListener to listen the animation event, then just reset the view property you animate. let's say cancel event and scaleX property:

scaleAnimator.setListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationCancel(Animator animation) {
        scaleView.setScaleX(0)
    }
});

Hope this can help a bit.

Virchow answered 28/8, 2018 at 3:41 Comment(0)
C
-4

You can add an AnimatorListener, to be notified when the animation ends:

scaleY.addListener(new AnimatorListener() {

            @Override
            public void onAnimationEnd(Animator animation) {
                // TODO Restore view

            }
            @Override
            public void onAnimationStart(Animator animation) {

            }

            @Override
            public void onAnimationRepeat(Animator animation) {

            }



            @Override
            public void onAnimationCancel(Animator animation) {

            }
        });
Club answered 23/12, 2014 at 8:21 Comment(3)
yes, i know, but... how can i restore the original status of the view?Epaulet
Have you tried clearing animation with yourView.clearAnimation()??Sambo
Ok, I see that you are using an ObjectAnimator. This is a Property animation. There is a good explanation here about the difference between Property Animation and View animation. #11856070. You should try to create a View animation, as it does not affect the original viewSambo

© 2022 - 2024 — McMap. All rights reserved.