Я хотел бы дважды перевести представление с помощью 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();
}
});
button.animate().translationX(button.translationX + 100f).setDuration(1000).start()
Работает как шарм
Причина, по которой ваша кнопка возвращается в исходное положение, описана в документации по методу ofFloat():
A single value implies that that value is the one being animated to, in which case the start value will be derived from the property being animated and the target object when
start()is called for the first time.
Поскольку вы каждый раз повторно используете один и тот же экземпляр 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) ... что ничего не делает.
Решение состоит в том, чтобы анимировать Текущий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();
}
});
++ translationX не будет сохраняться постоянно, вы можете сохранить его в
onSaveInstanceStateи восстановить после создания представления.