Причина, по которой ваша кнопка возвращается в исходное положение, описана в документации по методу 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 * 1026 представления* до текущего значения + 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();
}
});