在ViewPropertyAnimator中指定重复计数/模式?

Sof*_*ion 5 android

有没有办法在使用ViewPropertyAnimator时指定重复计数/模式?

And*_*ski 4

不幸的是,ViewPropertyAnimator没有任何方法来指定它执行的动画的重复次数。正如 ViewPropertyAnimator 中方法的 javadoc 中所述startAnimation()

启动一组属性的底层动画器。我们使用一个简单地从 0 运行到 1 的动画器,然后使用该小数值来相应地设置每个属性值。

不幸的是,它使用的值动画器是私有的,除了 的公共方法提供的之外,我们不可能以任何其他方式操纵它的状态ViewPropertyAnimator

重复动画

指定一个将在每次迭代后重新启动动画的AnimatorListenerViewPropertyAnimator

viewPropertyAnimator.setListener(new Animator.AnimatorListener() {

    ...

    @Override
    public void onAnimationEnd(Animator animation) {
        viewPropertyAnimator.start();
    }

    ...

});
viewPropertyAnimator.start();
Run Code Online (Sandbox Code Playgroud)

如果你想指定确切的执行次数,可以这样引入一个变量:

int[] repeatCount = {8}; //your repeat count goes here

viewPropertyAnimator.setListener(new Animator.AnimatorListener() {

    ...

    @Override
    public void onAnimationEnd(Animator animation) {
        if(repeatCount-- > 0)
            viewPropertyAnimator.start();
    }

    ...

});
viewPropertyAnimator.start();
Run Code Online (Sandbox Code Playgroud)

编辑

不过,您应该注意的是,通过(开始值和结束值)进行动画处理的值ViewPropertyAnimator存储在 的实例中ViewPropertyAnimator,因此在每次动画后不会刷新。因此,如果您想在每次迭代后以增量方式对视图的某些属性进行动画处理,请确保在每次开始之前创建动画制作器的新实例。就像这样:

public void animateEndlessly(final View v) {
        ViewPropertyAnimator viewPropertyAnimator = v.animate().scaleX(1.5f).scaleY(1.5f).setDuration(300);
        viewPropertyAnimator.setListener(new Animator.AnimatorListener() {

            ...

            @Override
            public void onAnimationEnd(Animator animation) {
                animateEndlessly(v);
            }

            ...

        });
        viewPropertyAnimator.start();
    }
Run Code Online (Sandbox Code Playgroud)