Source code
package android.support.v4.animation;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
class DonutAnimatorCompatProvider implements AnimatorProvider {
private static class DonutFloatValueAnimator implements ValueAnimatorCompat {
private long mDuration = 200;
private boolean mEnded = false;
private float mFraction = 0.0f;
List<AnimatorListenerCompat> mListeners = new ArrayList();
private Runnable mLoopRunnable = new Runnable() {
public void run() {
float fraction = (((float) (DonutFloatValueAnimator.this.getTime() - DonutFloatValueAnimator.this.mStartTime)) * 1.0f) / ((float) DonutFloatValueAnimator.this.mDuration);
if (fraction > 1.0f || DonutFloatValueAnimator.this.mTarget.getParent() == null) {
fraction = 1.0f;
}
DonutFloatValueAnimator.this.mFraction = fraction;
DonutFloatValueAnimator.this.notifyUpdateListeners();
if (DonutFloatValueAnimator.this.mFraction >= 1.0f) {
DonutFloatValueAnimator.this.dispatchEnd();
} else {
DonutFloatValueAnimator.this.mTarget.postDelayed(DonutFloatValueAnimator.this.mLoopRunnable, 16);
}
}
};
private long mStartTime;
private boolean mStarted = false;
View mTarget;
List<AnimatorUpdateListenerCompat> mUpdateListeners = new ArrayList();
private void notifyUpdateListeners() {
for (int i = this.mUpdateListeners.size() - 1; i >= 0; i--) {
((AnimatorUpdateListenerCompat) this.mUpdateListeners.get(i)).onAnimationUpdate(this);
}
}
public void setTarget(View view) {
this.mTarget = view;
}
public void addListener(AnimatorListenerCompat listener) {
this.mListeners.add(listener);
}
public void setDuration(long duration) {
if (!this.mStarted) {
this.mDuration = duration;
}
}
public void start() {
if (!this.mStarted) {
this.mStarted = true;
dispatchStart();
this.mFraction = 0.0f;
this.mStartTime = getTime();
this.mTarget.postDelayed(this.mLoopRunnable, 16);
}
}
private long getTime() {
return this.mTarget.getDrawingTime();
}
private void dispatchStart() {
for (int i = this.mListeners.size() - 1; i >= 0; i--) {
((AnimatorListenerCompat) this.mListeners.get(i)).onAnimationStart(this);
}
}
private void dispatchEnd() {
for (int i = this.mListeners.size() - 1; i >= 0; i--) {
((AnimatorListenerCompat) this.mListeners.get(i)).onAnimationEnd(this);
}
}
private void dispatchCancel() {
for (int i = this.mListeners.size() - 1; i >= 0; i--) {
((AnimatorListenerCompat) this.mListeners.get(i)).onAnimationCancel(this);
}
}
public void cancel() {
if (!this.mEnded) {
this.mEnded = true;
if (this.mStarted) {
dispatchCancel();
}
dispatchEnd();
}
}
public void addUpdateListener(AnimatorUpdateListenerCompat animatorUpdateListener) {
this.mUpdateListeners.add(animatorUpdateListener);
}
public float getAnimatedFraction() {
return this.mFraction;
}
}
DonutAnimatorCompatProvider() {
}
public ValueAnimatorCompat emptyValueAnimator() {
return new DonutFloatValueAnimator();
}
public void clearInterpolator(View view) {
}
}