mirror of https://github.com/NekoX-Dev/NekoX.git
164 lines
5.9 KiB
Java
164 lines
5.9 KiB
Java
|
/*
|
||
|
* This is the source code of Telegram for Android v. 2.0.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-2014.
|
||
|
*/
|
||
|
|
||
|
package org.telegram.ui.Components;
|
||
|
|
||
|
import android.graphics.Canvas;
|
||
|
import android.graphics.Paint;
|
||
|
import android.graphics.RectF;
|
||
|
import android.graphics.drawable.Drawable;
|
||
|
import android.view.View;
|
||
|
import android.view.animation.DecelerateInterpolator;
|
||
|
|
||
|
import org.telegram.android.AndroidUtilities;
|
||
|
|
||
|
public class RadialProgress {
|
||
|
|
||
|
private long lastUpdateTime = 0;
|
||
|
private float radOffset = 0;
|
||
|
private float currentProgress = 0;
|
||
|
private float animationProgressStart = 0;
|
||
|
private long currentProgressTime = 0;
|
||
|
private float animatedProgressValue = 0;
|
||
|
private RectF progressRect = new RectF();
|
||
|
private RectF cicleRect = new RectF();
|
||
|
private View parent = null;
|
||
|
private float animatedAlphaValue = 1.0f;
|
||
|
|
||
|
private boolean currentWithRound;
|
||
|
private boolean previousWithRound;
|
||
|
private Drawable currentDrawable;
|
||
|
private Drawable previousDrawable;
|
||
|
private boolean hideCurrentDrawable;
|
||
|
|
||
|
private static DecelerateInterpolator decelerateInterpolator = null;
|
||
|
private static Paint progressPaint = null;
|
||
|
|
||
|
public RadialProgress(View parentView) {
|
||
|
if (decelerateInterpolator == null) {
|
||
|
decelerateInterpolator = new DecelerateInterpolator();
|
||
|
progressPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
||
|
progressPaint.setStyle(Paint.Style.STROKE);
|
||
|
progressPaint.setStrokeCap(Paint.Cap.ROUND);
|
||
|
progressPaint.setStrokeWidth(AndroidUtilities.dp(2));
|
||
|
progressPaint.setColor(0xffffffff);
|
||
|
}
|
||
|
parent = parentView;
|
||
|
}
|
||
|
|
||
|
public void setProgressRect(int left, int top, int right, int bottom) {
|
||
|
progressRect.set(left, top, right, bottom);
|
||
|
}
|
||
|
|
||
|
private void updateAnimation() {
|
||
|
long newTime = System.currentTimeMillis();
|
||
|
long dt = newTime - lastUpdateTime;
|
||
|
lastUpdateTime = newTime;
|
||
|
|
||
|
if (animatedProgressValue != 1) {
|
||
|
radOffset += 360 * dt / 3000.0f;
|
||
|
float progressDiff = currentProgress - animationProgressStart;
|
||
|
if (progressDiff > 0) {
|
||
|
currentProgressTime += dt;
|
||
|
if (currentProgressTime >= 300) {
|
||
|
animatedProgressValue = currentProgress;
|
||
|
animationProgressStart = currentProgress;
|
||
|
currentProgressTime = 0;
|
||
|
} else {
|
||
|
animatedProgressValue = animationProgressStart + progressDiff * decelerateInterpolator.getInterpolation(currentProgressTime / 300.0f);
|
||
|
}
|
||
|
}
|
||
|
invalidateParent();
|
||
|
}
|
||
|
if (animatedProgressValue >= 1 && previousDrawable != null) {
|
||
|
animatedAlphaValue -= dt / 200.0f;
|
||
|
if (animatedAlphaValue <= 0) {
|
||
|
animatedAlphaValue = 0.0f;
|
||
|
previousDrawable = null;
|
||
|
}
|
||
|
invalidateParent();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void setProgressColor(int color) {
|
||
|
progressPaint.setColor(color);
|
||
|
}
|
||
|
|
||
|
public void setHideCurrentDrawable(boolean value) {
|
||
|
hideCurrentDrawable = value;
|
||
|
}
|
||
|
|
||
|
public void setProgress(float value, boolean animated) {
|
||
|
if (!animated) {
|
||
|
animatedProgressValue = value;
|
||
|
animationProgressStart = value;
|
||
|
} else {
|
||
|
animationProgressStart = animatedProgressValue;
|
||
|
}
|
||
|
currentProgress = value;
|
||
|
currentProgressTime = 0;
|
||
|
|
||
|
invalidateParent();
|
||
|
}
|
||
|
|
||
|
private void invalidateParent() {
|
||
|
int offset = AndroidUtilities.dp(2);
|
||
|
parent.invalidate((int)progressRect.left - offset, (int)progressRect.top - offset, (int)progressRect.right + offset * 2, (int)progressRect.bottom + offset * 2);
|
||
|
}
|
||
|
|
||
|
public void setBackground(Drawable drawable, boolean withRound, boolean animated) {
|
||
|
lastUpdateTime = System.currentTimeMillis();
|
||
|
if (animated && currentDrawable != drawable) {
|
||
|
setProgress(1, animated);
|
||
|
previousDrawable = currentDrawable;
|
||
|
previousWithRound = currentWithRound;
|
||
|
animatedAlphaValue = 1.0f;
|
||
|
} else {
|
||
|
previousDrawable = null;
|
||
|
previousWithRound = false;
|
||
|
}
|
||
|
currentWithRound = withRound;
|
||
|
currentDrawable = drawable;
|
||
|
invalidateParent();
|
||
|
}
|
||
|
|
||
|
public void swapBackground(Drawable drawable) {
|
||
|
currentDrawable = drawable;
|
||
|
}
|
||
|
|
||
|
public void onDraw(Canvas canvas) {
|
||
|
if (previousDrawable != null) {
|
||
|
previousDrawable.setAlpha((int)(255 * animatedAlphaValue));
|
||
|
previousDrawable.setBounds((int)progressRect.left, (int)progressRect.top, (int)progressRect.right, (int)progressRect.bottom);
|
||
|
previousDrawable.draw(canvas);
|
||
|
}
|
||
|
|
||
|
if (!hideCurrentDrawable && currentDrawable != null) {
|
||
|
if (previousDrawable != null) {
|
||
|
currentDrawable.setAlpha((int)(255 * (1.0f - animatedAlphaValue)));
|
||
|
} else {
|
||
|
currentDrawable.setAlpha(255);
|
||
|
}
|
||
|
currentDrawable.setBounds((int)progressRect.left, (int)progressRect.top, (int)progressRect.right, (int)progressRect.bottom);
|
||
|
currentDrawable.draw(canvas);
|
||
|
}
|
||
|
|
||
|
if (currentWithRound || previousWithRound) {
|
||
|
int diff = AndroidUtilities.dp(1);
|
||
|
if (previousWithRound) {
|
||
|
progressPaint.setAlpha((int)(255 * animatedAlphaValue));
|
||
|
} else {
|
||
|
progressPaint.setAlpha(255);
|
||
|
}
|
||
|
cicleRect.set(progressRect.left + diff, progressRect.top + diff, progressRect.right - diff, progressRect.bottom - diff);
|
||
|
canvas.drawArc(cicleRect, -90 + radOffset, Math.max(4, 360 * animatedProgressValue), false, progressPaint);
|
||
|
updateAnimation();
|
||
|
}
|
||
|
}
|
||
|
}
|