public void start() {
   if (mStarted) return;
   checkState();
   mRunCount = 0;
   mStarted = true;
   mStartTime = AnimationUtils.currentAnimationTimeMillis();
   Compat.postOnAnimation(mView, this);
 }
    @Override
    public final void run() {
      if (!mStarted) return;

      final long timeElapsed = AnimationUtils.currentAnimationTimeMillis() - mStartTime;
      mAnimationValue = mInterpolator.getInterpolation(timeElapsed / (float) mDuration);

      onAnimationUpdate();

      if (timeElapsed < mDuration) {
        Compat.postOnAnimation(mView, this);
      } else {
        if (++mRunCount < mRepeatCount || mRepeatCount == INFINITE) {
          restart();
        }
      }
    }
 private void restart() {
   mStartTime = AnimationUtils.currentAnimationTimeMillis();
   Compat.postOnAnimation(mView, this);
 }