Android ValueAnimator делает паузу во время повтора

Поэтому я использую ValueAnimator для анимации конечностей фигурки палки из одной позиции в другую, в бесконечном цикле или, по крайней мере, до тех пор, пока анимация не будет остановлена. Моя проблема в том, что когда аниматор повторяется, у меня небольшая пауза, как будто анимация отстает, но это происходит только тогда, когда анимация повторяется. У меня есть другие анимации, которые случаются только один раз, и они работают идеально гладко, и они каждый раз производят столько же вычислений, поэтому я сейчас думаю, что это проблема с ValueAnimator.

В прошлом я мог найти других людей, жалующихся на эту проблему, но я не смог найти никого, кто нашел решение. Ребята, вы знаете, если это реальная проблема с Android ValueAnimator? Если да, знаете ли вы какие-либо решения? Если нет, у вас, ребята, есть идеи, почему это может происходить со мной только в одном месте анимации? Я действительно застрял на этом.

Мой код для установки ValueAnimator:

    mFigureAnimator = ValueAnimator.ofFloat(0f, 1f);
    mFigureAnimator.setInterpolator(new LinearInterpolator());
    mFigureAnimator.setDuration(1000);
    mFigureAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      public void onAnimationUpdate(ValueAnimator animation) {
        Float delta = (Float)animation.getAnimatedValue();

        // Set the drawn locations based on the animated time and the start/end

        invalidate();

      }
    });
    mFigureAnimator.setRepeatCount(ValueAnimator.INFINITE);
    mFigureAnimator.setRepeatMode(ValueAnimator.RESTART);
    mFigureAnimator.start();

1 ответ

Для анимации вы можете настроить интерполятор как LinearInterpolator в файле анимации:

android:interpolator="@android:anim/linear_interpolator"

для Аниматора LinearInterpolator также работает для меня, у меня был вращатель аниматора, сделать вращение на 360 градусов и повторить бесконечно:

public class RotateAnimator {
    private float mDegrees;
    private ObjectAnimator mAnim;

    private RotateAnimator() {
        mAnim = ObjectAnimator.ofFloat(this, "degrees", 360);
        mAnim.setInterpolator(new LinearInterpolator());
        mAnim.setRepeatCount(ValueAnimator.INFINITE);
        mAnim.setRepeatMode(ValueAnimator.INFINITE);
        mAnim.setEvaluator(new FloatEvaluator());
        mAnim.setDuration(2000);
        mAnim.start();
    }

    public float getDegrees() {
        return mDegrees;
    }

    public void setDegrees(float degrees) {
        this.mDegrees = degrees;
        // invalidate the view so it can redraw itself
        invalidate();
    }

}

таким образом я решил мою проблему, если вы не можете найти другое решение, надеюсь, это поможет вам, удачи.

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