mirror of https://github.com/NekoX-Dev/NekoX.git
131 lines
4.0 KiB
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();
|
|
}
|
|
}
|