mirror of https://github.com/NekoX-Dev/NekoX.git
81 lines
2.6 KiB
Java
81 lines
2.6 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Color;
|
|
import android.graphics.Paint;
|
|
import android.graphics.RectF;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
|
|
public class InfiniteProgress {
|
|
|
|
private long lastUpdateTime;
|
|
private float radOffset;
|
|
private float currentCircleLength;
|
|
private boolean risingCircleLength;
|
|
private float currentProgressTime;
|
|
private RectF cicleRect = new RectF();
|
|
|
|
private int progressColor;
|
|
|
|
private Paint progressPaint;
|
|
private static final float rotationTime = 2000;
|
|
private static final float risingTime = 500;
|
|
private int radius;
|
|
|
|
public InfiniteProgress(int rad) {
|
|
radius = rad;
|
|
|
|
progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
progressPaint.setStyle(Paint.Style.STROKE);
|
|
progressPaint.setStrokeCap(Paint.Cap.ROUND);
|
|
}
|
|
|
|
public void setAlpha(float alpha) {
|
|
progressPaint.setAlpha((int) (alpha * Color.alpha(progressColor)));
|
|
}
|
|
|
|
public void setColor(int color) {
|
|
progressColor = color;
|
|
progressPaint.setColor(progressColor);
|
|
}
|
|
|
|
private void updateAnimation() {
|
|
long newTime = System.currentTimeMillis();
|
|
long dt = newTime - lastUpdateTime;
|
|
if (dt > 17) {
|
|
dt = 17;
|
|
}
|
|
lastUpdateTime = newTime;
|
|
|
|
radOffset += 360 * dt / rotationTime;
|
|
int count = (int) (radOffset / 360);
|
|
radOffset -= count * 360;
|
|
|
|
currentProgressTime += dt;
|
|
if (currentProgressTime >= risingTime) {
|
|
currentProgressTime = risingTime;
|
|
}
|
|
if (risingCircleLength) {
|
|
currentCircleLength = 4 + 266 * AndroidUtilities.accelerateInterpolator.getInterpolation(currentProgressTime / risingTime);
|
|
} else {
|
|
currentCircleLength = 4 - 270 * (1.0f - AndroidUtilities.decelerateInterpolator.getInterpolation(currentProgressTime / risingTime));
|
|
}
|
|
if (currentProgressTime == risingTime) {
|
|
if (risingCircleLength) {
|
|
radOffset += 270;
|
|
currentCircleLength = -266;
|
|
}
|
|
risingCircleLength = !risingCircleLength;
|
|
currentProgressTime = 0;
|
|
}
|
|
}
|
|
|
|
public void draw(Canvas canvas, float cx, float cy, float scale) {
|
|
cicleRect.set(cx - radius * scale, cy - radius * scale, cx + radius * scale, cy + radius * scale);
|
|
progressPaint.setStrokeWidth(AndroidUtilities.dp(2) * scale);
|
|
canvas.drawArc(cicleRect, radOffset, currentCircleLength, false, progressPaint);
|
|
updateAnimation();
|
|
}
|
|
}
|