ObjectAnimator, как переместить объект дважды?

Я хотел бы дважды перевести представление с помощью 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();

            }
        });

ObjectAnimator, как переместить объект дважды?

1
0
1 425
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Работает как шарм

++ translationX не будет сохраняться постоянно, вы можете сохранить его в onSaveInstanceState и восстановить после создания представления.

Karma Maker 05.10.2018 00:34
Ответ принят как подходящий

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

Другие вопросы по теме