我想用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();
}
});
答案 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();
}
});