如何将ObjectAnimator重置为它的初始状态?

时间:2014-12-23 08:12:28

标签: android android-animation android-view objectanimator

我想使用scaleX和scaleY振动视图,我正在使用此代码进行操作,但问题是有时视图未正确重置,并且显示应用了缩放...

我希望在动画结束时,必须看到视图的原始状态始终为

这是代码:

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

由于

3 个答案:

答案 0 :(得分:13)

对于ValueAnimator和ObjectAnimator可以这样尝试:

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

UPDATE 在Android 7上它不起作用。 最好的方法是使用插值器。

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

在您的代码中

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

答案 1 :(得分:1)


根据文档(Property Animation):

  

属性动画系统可以通过更改View对象中的实际属性来为屏幕上的View设置动画。此外,只要更改了属性,View还将自动调用invalidate()方法刷新屏幕。

因此您可以使用AnimatorListener来收听动画事件,然后只需重置您设置动画的view属性。假设cancel事件和scaleX属性:

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

希望这会有所帮助。

答案 2 :(得分:-3)

您可以添加AnimatorListener,以便在动画结束时收到通知:

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

            }
        });