NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/RadialProgressView.java

131 lines
4.0 KiB
Java

/*
* This is the source code of Telegram for Android v. 5.x.x.
* It is licensed under GNU GPL v. 2 or later.
* You should have received a copy of the license in this archive (see LICENSE).
*
* Copyright Nikolai Kudashov, 2013-2018.
*/
package org.telegram.ui.Components;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import androidx.annotation.Keep;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.ui.ActionBar.Theme;
public class RadialProgressView extends View {
private long lastUpdateTime;
private float radOffset;
private float currentCircleLength;
private boolean risingCircleLength;
private float currentProgressTime;
private RectF cicleRect = new RectF();
private boolean useSelfAlpha;
private int progressColor;
private DecelerateInterpolator decelerateInterpolator;
private AccelerateInterpolator accelerateInterpolator;
private Paint progressPaint;
private static final float rotationTime = 2000;
private static final float risingTime = 500;
private int size;
public RadialProgressView(Context context) {
super(context);
size = AndroidUtilities.dp(40);
progressColor = Theme.getColor(Theme.key_progressCircle);
decelerateInterpolator = new DecelerateInterpolator();
accelerateInterpolator = new AccelerateInterpolator();
progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
progressPaint.setStyle(Paint.Style.STROKE);
progressPaint.setStrokeCap(Paint.Cap.ROUND);
progressPaint.setStrokeWidth(AndroidUtilities.dp(3));
progressPaint.setColor(progressColor);
}
public void setUseSelfAlpha(boolean value) {
useSelfAlpha = value;
}
@Keep
@Override
public void setAlpha(float alpha) {
super.setAlpha(alpha);
if (useSelfAlpha) {
Drawable background = getBackground();
int a = (int) (alpha * 255);
if (background != null) {
background.setAlpha(a);
}
progressPaint.setAlpha(a);
}
}
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 * accelerateInterpolator.getInterpolation(currentProgressTime / risingTime);
} else {
currentCircleLength = 4 - 270 * (1.0f - decelerateInterpolator.getInterpolation(currentProgressTime / risingTime));
}
if (currentProgressTime == risingTime) {
if (risingCircleLength) {
radOffset += 270;
currentCircleLength = -266;
}
risingCircleLength = !risingCircleLength;
currentProgressTime = 0;
}
invalidate();
}
public void setSize(int value) {
size = value;
invalidate();
}
public void setStrokeWidth(float value) {
progressPaint.setStrokeWidth(AndroidUtilities.dp(value));
}
public void setProgressColor(int color) {
progressColor = color;
progressPaint.setColor(progressColor);
}
@Override
protected void onDraw(Canvas canvas) {
int x = (getMeasuredWidth() - size) / 2;
int y = (getMeasuredHeight() - size) / 2;
cicleRect.set(x, y, x + size, y + size);
canvas.drawArc(cicleRect, radOffset, currentCircleLength, false, progressPaint);
updateAnimation();
}
}