Как я могу избежать ускорения / замедления анимации Animator?

Я создал цепочку (до 4) анимаций со следующим кодом. Все они представляют собой простые переводы нескольких изображений одновременно.

После одного анимационного "кадра" (т.е. перемещения всех видов) onAnimationEnd вызывает следующий кадр.

Проблема в том, что после каждого вызова onAnimationEnd существует небольшая, но заметная задержка. Похоже, что есть автоматическое ускорение и замедление переводов, чтобы сделать его более естественным, но в этом случае это нежелательно. Есть ли способ избежать этого?

Заранее спасибо!

private void animateFrame(final int frame) {

    List<Animator> allAnimations = new ArrayList<>();
    AnimatorSet s = new AnimatorSet();

    for (int p = 0; p < playerImages.size(); p++) {

        Animator animation = ObjectAnimator.ofFloat(playerImages.get(p), "translationX", playerPositions[frame][0][p] * factorX);

        allAnimations.add(animation);
        ObjectAnimator animation2 = ObjectAnimator.ofFloat(playerImages.get(p), "translationY", playerPositions[frame][1][p] * factorY);
        allAnimations.add(animation2);
        Log.d(TAG, "onClick: MOVING PLAYER " + p + " TO: " + playerPositions[frame][0][p] + "/" + playerPositions[frame][1][p]);

        if (playerPositions[frame][0][p] != 0) {
            s.playTogether(allAnimations);

            s.setDuration(durations[frame - 1]);
            s.start();

            s.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animator) {

                }

                @Override
                public void onAnimationEnd(Animator animator) {
                    animateFrame(frame+1);
                }

                @Override
                public void onAnimationCancel(Animator animator) {

                }

                @Override
                public void onAnimationRepeat(Animator animator) {

                }
            });

        }
    }

}

1 ответ

Решение

Цитирование из обзора анимации свойств

Интерполятор определяет, как конкретные значения в анимации рассчитываются как функция времени. Например, вы можете указать, что анимации должны происходить линейно по всей анимации, то есть анимация движется равномерно все время, или вы можете указать анимации для использования нелинейного времени, например, с использованием ускорения или замедления в начале или в конце анимация.

Интерполятором по умолчанию для анимации свойств является AccelerateDecelerateInterpolator, Но вы можете установить другой Интерполятор (любой класс, реализующий TimeInterpolator). От вашего вопроса, я думаю, что вы ищете LinearInterpolator:

animation.setInterpolator(new LinearInterpolator());
Другие вопросы по тегам