623 lines
20 KiB
Java
623 lines
20 KiB
Java
package androidx.swiperefreshlayout.widget;
|
|
|
|
import android.animation.Animator;
|
|
import android.animation.ValueAnimator;
|
|
import android.content.Context;
|
|
import android.content.res.Resources;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Paint;
|
|
import android.graphics.Path;
|
|
import android.graphics.Rect;
|
|
import android.graphics.RectF;
|
|
import android.graphics.drawable.Animatable;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.view.animation.Interpolator;
|
|
import android.view.animation.LinearInterpolator;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.core.util.Preconditions;
|
|
import androidx.interpolator.view.animation.FastOutSlowInInterpolator;
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
public class CircularProgressDrawable extends Drawable implements Animatable {
|
|
private static final int ANIMATION_DURATION = 1332;
|
|
private static final int ARROW_HEIGHT = 5;
|
|
private static final int ARROW_HEIGHT_LARGE = 6;
|
|
private static final int ARROW_WIDTH = 10;
|
|
private static final int ARROW_WIDTH_LARGE = 12;
|
|
private static final float CENTER_RADIUS = 7.5f;
|
|
private static final float CENTER_RADIUS_LARGE = 11.0f;
|
|
private static final int[] COLORS = {-16777216};
|
|
private static final float COLOR_CHANGE_OFFSET = 0.75f;
|
|
public static final int DEFAULT = 1;
|
|
private static final float GROUP_FULL_ROTATION = 216.0f;
|
|
public static final int LARGE = 0;
|
|
private static final Interpolator LINEAR_INTERPOLATOR = new LinearInterpolator();
|
|
private static final Interpolator MATERIAL_INTERPOLATOR = new FastOutSlowInInterpolator();
|
|
private static final float MAX_PROGRESS_ARC = 0.8f;
|
|
private static final float MIN_PROGRESS_ARC = 0.01f;
|
|
private static final float RING_ROTATION = 0.20999998f;
|
|
private static final float SHRINK_OFFSET = 0.5f;
|
|
private static final float STROKE_WIDTH = 2.5f;
|
|
private static final float STROKE_WIDTH_LARGE = 3.0f;
|
|
private Animator mAnimator;
|
|
public boolean mFinishing;
|
|
private Resources mResources;
|
|
private final Ring mRing;
|
|
private float mRotation;
|
|
public float mRotationCount;
|
|
|
|
/* renamed from: androidx.swiperefreshlayout.widget.CircularProgressDrawable$1 reason: invalid class name */
|
|
public class AnonymousClass1 implements ValueAnimator.AnimatorUpdateListener {
|
|
public final /* synthetic */ Ring val$ring;
|
|
|
|
public AnonymousClass1(Ring ring) {
|
|
this.val$ring = ring;
|
|
}
|
|
|
|
@Override // android.animation.ValueAnimator.AnimatorUpdateListener
|
|
public void onAnimationUpdate(ValueAnimator valueAnimator) {
|
|
float floatValue = ((Float) valueAnimator.getAnimatedValue()).floatValue();
|
|
CircularProgressDrawable.this.updateRingColor(floatValue, this.val$ring);
|
|
CircularProgressDrawable.this.applyTransformation(floatValue, this.val$ring, false);
|
|
CircularProgressDrawable.this.invalidateSelf();
|
|
}
|
|
}
|
|
|
|
/* renamed from: androidx.swiperefreshlayout.widget.CircularProgressDrawable$2 reason: invalid class name */
|
|
public class AnonymousClass2 implements Animator.AnimatorListener {
|
|
public final /* synthetic */ Ring val$ring;
|
|
|
|
public AnonymousClass2(Ring ring) {
|
|
this.val$ring = ring;
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationCancel(Animator animator) {
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationEnd(Animator animator) {
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationRepeat(Animator animator) {
|
|
CircularProgressDrawable.this.applyTransformation(1.0f, this.val$ring, true);
|
|
this.val$ring.storeOriginals();
|
|
this.val$ring.goToNextColor();
|
|
CircularProgressDrawable circularProgressDrawable = CircularProgressDrawable.this;
|
|
if (circularProgressDrawable.mFinishing) {
|
|
circularProgressDrawable.mFinishing = false;
|
|
animator.cancel();
|
|
animator.setDuration(1332);
|
|
animator.start();
|
|
this.val$ring.setShowArrow(false);
|
|
return;
|
|
}
|
|
circularProgressDrawable.mRotationCount += 1.0f;
|
|
}
|
|
|
|
@Override // android.animation.Animator.AnimatorListener
|
|
public void onAnimationStart(Animator animator) {
|
|
CircularProgressDrawable.this.mRotationCount = 0.0f;
|
|
}
|
|
}
|
|
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
|
|
public @interface ProgressDrawableSize {
|
|
}
|
|
|
|
public static class Ring {
|
|
public int mAlpha;
|
|
public Path mArrow;
|
|
public int mArrowHeight;
|
|
public final Paint mArrowPaint;
|
|
public float mArrowScale;
|
|
public int mArrowWidth;
|
|
public final Paint mCirclePaint;
|
|
public int mColorIndex;
|
|
public int[] mColors;
|
|
public int mCurrentColor;
|
|
public float mEndTrim;
|
|
public final Paint mPaint;
|
|
public float mRingCenterRadius;
|
|
public float mRotation;
|
|
public boolean mShowArrow;
|
|
public float mStartTrim;
|
|
public float mStartingEndTrim;
|
|
public float mStartingRotation;
|
|
public float mStartingStartTrim;
|
|
public float mStrokeWidth;
|
|
public final RectF mTempBounds = new RectF();
|
|
|
|
public Ring() {
|
|
Paint paint = new Paint();
|
|
this.mPaint = paint;
|
|
Paint paint2 = new Paint();
|
|
this.mArrowPaint = paint2;
|
|
Paint paint3 = new Paint();
|
|
this.mCirclePaint = paint3;
|
|
this.mStartTrim = 0.0f;
|
|
this.mEndTrim = 0.0f;
|
|
this.mRotation = 0.0f;
|
|
this.mStrokeWidth = 5.0f;
|
|
this.mArrowScale = 1.0f;
|
|
this.mAlpha = 255;
|
|
paint.setStrokeCap(Paint.Cap.SQUARE);
|
|
paint.setAntiAlias(true);
|
|
paint.setStyle(Paint.Style.STROKE);
|
|
paint2.setStyle(Paint.Style.FILL);
|
|
paint2.setAntiAlias(true);
|
|
paint3.setColor(0);
|
|
}
|
|
|
|
public void draw(Canvas canvas, Rect rect) {
|
|
RectF rectF = this.mTempBounds;
|
|
float f = this.mRingCenterRadius;
|
|
float f2 = (this.mStrokeWidth / 2.0f) + f;
|
|
if (f <= 0.0f) {
|
|
f2 = (((float) Math.min(rect.width(), rect.height())) / 2.0f) - Math.max((((float) this.mArrowWidth) * this.mArrowScale) / 2.0f, this.mStrokeWidth / 2.0f);
|
|
}
|
|
rectF.set(((float) rect.centerX()) - f2, ((float) rect.centerY()) - f2, ((float) rect.centerX()) + f2, ((float) rect.centerY()) + f2);
|
|
float f3 = this.mStartTrim;
|
|
float f4 = this.mRotation;
|
|
float f5 = (f3 + f4) * 360.0f;
|
|
float f6 = ((this.mEndTrim + f4) * 360.0f) - f5;
|
|
this.mPaint.setColor(this.mCurrentColor);
|
|
this.mPaint.setAlpha(this.mAlpha);
|
|
float f7 = this.mStrokeWidth / 2.0f;
|
|
rectF.inset(f7, f7);
|
|
canvas.drawCircle(rectF.centerX(), rectF.centerY(), rectF.width() / 2.0f, this.mCirclePaint);
|
|
float f8 = -f7;
|
|
rectF.inset(f8, f8);
|
|
canvas.drawArc(rectF, f5, f6, false, this.mPaint);
|
|
drawTriangle(canvas, f5, f6, rectF);
|
|
}
|
|
|
|
public void drawTriangle(Canvas canvas, float f, float f2, RectF rectF) {
|
|
if (this.mShowArrow) {
|
|
Path path = this.mArrow;
|
|
if (path == null) {
|
|
Path path2 = new Path();
|
|
this.mArrow = path2;
|
|
path2.setFillType(Path.FillType.EVEN_ODD);
|
|
} else {
|
|
path.reset();
|
|
}
|
|
this.mArrow.moveTo(0.0f, 0.0f);
|
|
this.mArrow.lineTo(((float) this.mArrowWidth) * this.mArrowScale, 0.0f);
|
|
Path path3 = this.mArrow;
|
|
float f3 = this.mArrowScale;
|
|
path3.lineTo((((float) this.mArrowWidth) * f3) / 2.0f, ((float) this.mArrowHeight) * f3);
|
|
this.mArrow.offset((rectF.centerX() + (Math.min(rectF.width(), rectF.height()) / 2.0f)) - ((((float) this.mArrowWidth) * this.mArrowScale) / 2.0f), (this.mStrokeWidth / 2.0f) + rectF.centerY());
|
|
this.mArrow.close();
|
|
this.mArrowPaint.setColor(this.mCurrentColor);
|
|
this.mArrowPaint.setAlpha(this.mAlpha);
|
|
canvas.save();
|
|
canvas.rotate(f + f2, rectF.centerX(), rectF.centerY());
|
|
canvas.drawPath(this.mArrow, this.mArrowPaint);
|
|
canvas.restore();
|
|
}
|
|
}
|
|
|
|
public int getAlpha() {
|
|
return this.mAlpha;
|
|
}
|
|
|
|
public float getArrowHeight() {
|
|
return (float) this.mArrowHeight;
|
|
}
|
|
|
|
public float getArrowScale() {
|
|
return this.mArrowScale;
|
|
}
|
|
|
|
public float getArrowWidth() {
|
|
return (float) this.mArrowWidth;
|
|
}
|
|
|
|
public int getBackgroundColor() {
|
|
return this.mCirclePaint.getColor();
|
|
}
|
|
|
|
public float getCenterRadius() {
|
|
return this.mRingCenterRadius;
|
|
}
|
|
|
|
public int[] getColors() {
|
|
return this.mColors;
|
|
}
|
|
|
|
public float getEndTrim() {
|
|
return this.mEndTrim;
|
|
}
|
|
|
|
public int getNextColor() {
|
|
return this.mColors[getNextColorIndex()];
|
|
}
|
|
|
|
public int getNextColorIndex() {
|
|
return (this.mColorIndex + 1) % this.mColors.length;
|
|
}
|
|
|
|
public float getRotation() {
|
|
return this.mRotation;
|
|
}
|
|
|
|
public boolean getShowArrow() {
|
|
return this.mShowArrow;
|
|
}
|
|
|
|
public float getStartTrim() {
|
|
return this.mStartTrim;
|
|
}
|
|
|
|
public int getStartingColor() {
|
|
return this.mColors[this.mColorIndex];
|
|
}
|
|
|
|
public float getStartingEndTrim() {
|
|
return this.mStartingEndTrim;
|
|
}
|
|
|
|
public float getStartingRotation() {
|
|
return this.mStartingRotation;
|
|
}
|
|
|
|
public float getStartingStartTrim() {
|
|
return this.mStartingStartTrim;
|
|
}
|
|
|
|
public Paint.Cap getStrokeCap() {
|
|
return this.mPaint.getStrokeCap();
|
|
}
|
|
|
|
public float getStrokeWidth() {
|
|
return this.mStrokeWidth;
|
|
}
|
|
|
|
public void goToNextColor() {
|
|
setColorIndex(getNextColorIndex());
|
|
}
|
|
|
|
public void resetOriginals() {
|
|
this.mStartingStartTrim = 0.0f;
|
|
this.mStartingEndTrim = 0.0f;
|
|
this.mStartingRotation = 0.0f;
|
|
setStartTrim(0.0f);
|
|
setEndTrim(0.0f);
|
|
setRotation(0.0f);
|
|
}
|
|
|
|
public void setAlpha(int i) {
|
|
this.mAlpha = i;
|
|
}
|
|
|
|
public void setArrowDimensions(float f, float f2) {
|
|
this.mArrowWidth = (int) f;
|
|
this.mArrowHeight = (int) f2;
|
|
}
|
|
|
|
public void setArrowScale(float f) {
|
|
if (f != this.mArrowScale) {
|
|
this.mArrowScale = f;
|
|
}
|
|
}
|
|
|
|
public void setBackgroundColor(int i) {
|
|
this.mCirclePaint.setColor(i);
|
|
}
|
|
|
|
public void setCenterRadius(float f) {
|
|
this.mRingCenterRadius = f;
|
|
}
|
|
|
|
public void setColor(int i) {
|
|
this.mCurrentColor = i;
|
|
}
|
|
|
|
public void setColorFilter(ColorFilter colorFilter) {
|
|
this.mPaint.setColorFilter(colorFilter);
|
|
}
|
|
|
|
public void setColorIndex(int i) {
|
|
this.mColorIndex = i;
|
|
this.mCurrentColor = this.mColors[i];
|
|
}
|
|
|
|
public void setColors(@NonNull int[] iArr) {
|
|
this.mColors = iArr;
|
|
setColorIndex(0);
|
|
}
|
|
|
|
public void setEndTrim(float f) {
|
|
this.mEndTrim = f;
|
|
}
|
|
|
|
public void setRotation(float f) {
|
|
this.mRotation = f;
|
|
}
|
|
|
|
public void setShowArrow(boolean z2) {
|
|
if (this.mShowArrow != z2) {
|
|
this.mShowArrow = z2;
|
|
}
|
|
}
|
|
|
|
public void setStartTrim(float f) {
|
|
this.mStartTrim = f;
|
|
}
|
|
|
|
public void setStrokeCap(Paint.Cap cap) {
|
|
this.mPaint.setStrokeCap(cap);
|
|
}
|
|
|
|
public void setStrokeWidth(float f) {
|
|
this.mStrokeWidth = f;
|
|
this.mPaint.setStrokeWidth(f);
|
|
}
|
|
|
|
public void storeOriginals() {
|
|
this.mStartingStartTrim = this.mStartTrim;
|
|
this.mStartingEndTrim = this.mEndTrim;
|
|
this.mStartingRotation = this.mRotation;
|
|
}
|
|
}
|
|
|
|
public CircularProgressDrawable(@NonNull Context context) {
|
|
this.mResources = ((Context) Preconditions.checkNotNull(context)).getResources();
|
|
Ring ring = new Ring();
|
|
this.mRing = ring;
|
|
ring.setColors(COLORS);
|
|
setStrokeWidth(2.5f);
|
|
setupAnimators();
|
|
}
|
|
|
|
private void applyFinishTranslation(float f, Ring ring) {
|
|
updateRingColor(f, ring);
|
|
ring.setStartTrim((((ring.getStartingEndTrim() - 0.01f) - ring.getStartingStartTrim()) * f) + ring.getStartingStartTrim());
|
|
ring.setEndTrim(ring.getStartingEndTrim());
|
|
ring.setRotation(((((float) (Math.floor((double) (ring.getStartingRotation() / 0.8f)) + 1.0d)) - ring.getStartingRotation()) * f) + ring.getStartingRotation());
|
|
}
|
|
|
|
private int evaluateColorChange(float f, int i, int i2) {
|
|
int i3 = (i >> 24) & 255;
|
|
int i4 = (i >> 16) & 255;
|
|
int i5 = (i >> 8) & 255;
|
|
int i6 = i & 255;
|
|
return ((i3 + ((int) (((float) (((i2 >> 24) & 255) - i3)) * f))) << 24) | ((i4 + ((int) (((float) (((i2 >> 16) & 255) - i4)) * f))) << 16) | ((i5 + ((int) (((float) (((i2 >> 8) & 255) - i5)) * f))) << 8) | (i6 + ((int) (f * ((float) ((i2 & 255) - i6)))));
|
|
}
|
|
|
|
private float getRotation() {
|
|
return this.mRotation;
|
|
}
|
|
|
|
private void setRotation(float f) {
|
|
this.mRotation = f;
|
|
}
|
|
|
|
private void setSizeParameters(float f, float f2, float f3, float f4) {
|
|
Ring ring = this.mRing;
|
|
float f5 = this.mResources.getDisplayMetrics().density;
|
|
ring.setStrokeWidth(f2 * f5);
|
|
ring.setCenterRadius(f * f5);
|
|
ring.setColorIndex(0);
|
|
ring.setArrowDimensions(f3 * f5, f4 * f5);
|
|
}
|
|
|
|
private void setupAnimators() {
|
|
Ring ring = this.mRing;
|
|
ValueAnimator ofFloat = ValueAnimator.ofFloat(0.0f, 1.0f);
|
|
ofFloat.addUpdateListener(new AnonymousClass1(ring));
|
|
ofFloat.setRepeatCount(-1);
|
|
ofFloat.setRepeatMode(1);
|
|
ofFloat.setInterpolator(LINEAR_INTERPOLATOR);
|
|
ofFloat.addListener(new AnonymousClass2(ring));
|
|
this.mAnimator = ofFloat;
|
|
}
|
|
|
|
public void applyTransformation(float f, Ring ring, boolean z2) {
|
|
float f2;
|
|
float f3;
|
|
if (this.mFinishing) {
|
|
applyFinishTranslation(f, ring);
|
|
} else if (f != 1.0f || z2) {
|
|
float startingRotation = ring.getStartingRotation();
|
|
if (f < 0.5f) {
|
|
f2 = ring.getStartingStartTrim();
|
|
f3 = (MATERIAL_INTERPOLATOR.getInterpolation(f / 0.5f) * 0.79f) + 0.01f + f2;
|
|
} else {
|
|
float startingStartTrim = ring.getStartingStartTrim() + 0.79f;
|
|
f2 = startingStartTrim - (((1.0f - MATERIAL_INTERPOLATOR.getInterpolation((f - 0.5f) / 0.5f)) * 0.79f) + 0.01f);
|
|
f3 = startingStartTrim;
|
|
}
|
|
ring.setStartTrim(f2);
|
|
ring.setEndTrim(f3);
|
|
ring.setRotation((0.20999998f * f) + startingRotation);
|
|
setRotation((f + this.mRotationCount) * 216.0f);
|
|
}
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public void draw(Canvas canvas) {
|
|
Rect bounds = getBounds();
|
|
canvas.save();
|
|
canvas.rotate(this.mRotation, bounds.exactCenterX(), bounds.exactCenterY());
|
|
this.mRing.draw(canvas, bounds);
|
|
canvas.restore();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public int getAlpha() {
|
|
return this.mRing.getAlpha();
|
|
}
|
|
|
|
public boolean getArrowEnabled() {
|
|
return this.mRing.getShowArrow();
|
|
}
|
|
|
|
public float getArrowHeight() {
|
|
return this.mRing.getArrowHeight();
|
|
}
|
|
|
|
public float getArrowScale() {
|
|
return this.mRing.getArrowScale();
|
|
}
|
|
|
|
public float getArrowWidth() {
|
|
return this.mRing.getArrowWidth();
|
|
}
|
|
|
|
public int getBackgroundColor() {
|
|
return this.mRing.getBackgroundColor();
|
|
}
|
|
|
|
public float getCenterRadius() {
|
|
return this.mRing.getCenterRadius();
|
|
}
|
|
|
|
@NonNull
|
|
public int[] getColorSchemeColors() {
|
|
return this.mRing.getColors();
|
|
}
|
|
|
|
public float getEndTrim() {
|
|
return this.mRing.getEndTrim();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public int getOpacity() {
|
|
return -3;
|
|
}
|
|
|
|
public float getProgressRotation() {
|
|
return this.mRing.getRotation();
|
|
}
|
|
|
|
public float getStartTrim() {
|
|
return this.mRing.getStartTrim();
|
|
}
|
|
|
|
@NonNull
|
|
public Paint.Cap getStrokeCap() {
|
|
return this.mRing.getStrokeCap();
|
|
}
|
|
|
|
public float getStrokeWidth() {
|
|
return this.mRing.getStrokeWidth();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Animatable
|
|
public boolean isRunning() {
|
|
return this.mAnimator.isRunning();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public void setAlpha(int i) {
|
|
this.mRing.setAlpha(i);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setArrowDimensions(float f, float f2) {
|
|
this.mRing.setArrowDimensions(f, f2);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setArrowEnabled(boolean z2) {
|
|
this.mRing.setShowArrow(z2);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setArrowScale(float f) {
|
|
this.mRing.setArrowScale(f);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setBackgroundColor(int i) {
|
|
this.mRing.setBackgroundColor(i);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setCenterRadius(float f) {
|
|
this.mRing.setCenterRadius(f);
|
|
invalidateSelf();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Drawable
|
|
public void setColorFilter(ColorFilter colorFilter) {
|
|
this.mRing.setColorFilter(colorFilter);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setColorSchemeColors(@NonNull int... iArr) {
|
|
this.mRing.setColors(iArr);
|
|
this.mRing.setColorIndex(0);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setProgressRotation(float f) {
|
|
this.mRing.setRotation(f);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setStartEndTrim(float f, float f2) {
|
|
this.mRing.setStartTrim(f);
|
|
this.mRing.setEndTrim(f2);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setStrokeCap(@NonNull Paint.Cap cap) {
|
|
this.mRing.setStrokeCap(cap);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setStrokeWidth(float f) {
|
|
this.mRing.setStrokeWidth(f);
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void setStyle(int i) {
|
|
if (i == 0) {
|
|
setSizeParameters(11.0f, 3.0f, 12.0f, 6.0f);
|
|
} else {
|
|
setSizeParameters(7.5f, 2.5f, 10.0f, 5.0f);
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Animatable
|
|
public void start() {
|
|
this.mAnimator.cancel();
|
|
this.mRing.storeOriginals();
|
|
if (this.mRing.getEndTrim() != this.mRing.getStartTrim()) {
|
|
this.mFinishing = true;
|
|
this.mAnimator.setDuration(666);
|
|
this.mAnimator.start();
|
|
return;
|
|
}
|
|
this.mRing.setColorIndex(0);
|
|
this.mRing.resetOriginals();
|
|
this.mAnimator.setDuration(1332);
|
|
this.mAnimator.start();
|
|
}
|
|
|
|
@Override // android.graphics.drawable.Animatable
|
|
public void stop() {
|
|
this.mAnimator.cancel();
|
|
setRotation(0.0f);
|
|
this.mRing.setShowArrow(false);
|
|
this.mRing.setColorIndex(0);
|
|
this.mRing.resetOriginals();
|
|
invalidateSelf();
|
|
}
|
|
|
|
public void updateRingColor(float f, Ring ring) {
|
|
if (f > 0.75f) {
|
|
ring.setColor(evaluateColorChange((f - 0.75f) / 0.25f, ring.getStartingColor(), ring.getNextColor()));
|
|
} else {
|
|
ring.setColor(ring.getStartingColor());
|
|
}
|
|
}
|
|
}
|