Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android ValueAnimator pauses during repeat

So I'm using a ValueAnimator to animate a stick figure's limbs from one position to another, in an infinite loop, or at least until the animation is stopped. My problem is that when the animator repeats I have a slight pause as if the animation is lagging behind, but it only happens when the animation repeats. I have other animations that only happen once and those run perfectly smoothly, and they have just as much computation each time so I'm currently thinking that it's a problem with the ValueAnimator.

In the past I was able to find other people complaining about this problem, but I haven't been able to find anyone who has found a solution. Do you guys know if this is a real problem with the Android ValueAnimator? If so, do you know of any solutions? If not, do you guys have any ideas as to why this could be happening to me in just that one place in the animation? I'm really stuck on this one.

My code for the ValueAnimator setup is this:

    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();
like image 958
Intrivix Avatar asked Feb 15 '23 17:02

Intrivix


1 Answers

for Animation, you can configure the interpolator as LinearInterpolator in the animation file :

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

for Animator, LinearInterpolator also work for me, I had a rotate animator, do 360 degrees rotation and repeat infinite:

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();
    }

}

that way solved my problem, if you couldn't find another solution, hope this can help you, good luck.

like image 177
VinceStyling Avatar answered Feb 24 '23 16:02

VinceStyling