ObjectAnimator,如何两次移动对象?

时间:2018-10-04 22:03:37

标签: android android-animation

我想用ObjectAnimator两次转换视图,但是再次按下按钮后,“ X”位置又回到起始位置,在这种情况下我如何使其继续并向右移动?

final ObjectAnimator animation = ObjectAnimator.ofFloat(button, "translationX", 100f);
        animation.setDuration(2000);

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                animation.start();

            }
        });

enter image description here

2 个答案:

答案 0 :(得分:1)

button.animate().translationX(button.translationX + 100f).setDuration(1000).start()

像魅力一样工作

答案 1 :(得分:1)

ofFloat()方法的文档中介绍了按钮跳回到其起始位置的原因:

  

单个值表示该值是要对其进行动画处理的值,在这种情况下,初次调用start()时,起始值将从受动画处理的属性和目标对象得出。

因为每次都重复使用相同的ObjectAnimator实例,所以translationX属性每次都从其原始(0)动画化为传入的参数(100)。

但是,您不能仅仅对其进行更改以创建新的ObjectAnimator并解决所有问题。假设您将代码更改为此:

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        final ObjectAnimator animation = ObjectAnimator.ofFloat(button, "translationX", 100f);
        animation.setDuration(2000);
        animation.start();
    }
});

那会改变发生的事情,但仍然不能给你想要的东西。现在,该按钮将首次从0滑动到100,但此后每次都会保持静止。

为什么?

因为在第一个动画之后,translationX属性是100。所以现在您要在100和100之间(而不是0和100)之间进行动画处理...

解决方案是将视图的 current translationX设置为当前值+100。然后每次都这样做,而不是重复使用相同的ObjectAnimator一遍又一遍。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        float end = button.getTranslationX() + 100;
        ObjectAnimator animation = ObjectAnimator.ofFloat(button, "translationX", end);
        animation.setDuration(2000);
        animation.start();
    }
});