How to reset ObjectAnimator to it's initial status?

本秂侑毒 提交于 2019-12-19 05:32:22

问题


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


回答1:


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();
        }
});



回答2:



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.




回答3:


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) {

            }
        });


来源:https://stackoverflow.com/questions/27616444/how-to-reset-objectanimator-to-its-initial-status

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!