ObjectAnimator, как переместить объект дважды? - PullRequest
0 голосов
/ 05 октября 2018

Я бы хотел перевести представление с 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 голосов
/ 05 октября 2018

Причина, по которой ваша кнопка возвращается в исходное положение, описана в документации по методу 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();
    }
});
0 голосов
/ 05 октября 2018
button.animate().translationX(button.translationX + 100f).setDuration(1000).start()

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

...