mirror of https://github.com/NekoX-Dev/NekoX.git
135 lines
4.2 KiB
Java
135 lines
4.2 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Paint;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
|
|
public class ChoosingStickerStatusDrawable extends StatusDrawable {
|
|
|
|
Paint strokePaint;
|
|
Paint fillPaint;
|
|
|
|
private boolean isChat = false;
|
|
private long lastUpdateTime = 0;
|
|
private boolean started = false;
|
|
float progress;
|
|
boolean increment = true;
|
|
|
|
public ChoosingStickerStatusDrawable(boolean createPaint) {
|
|
if (createPaint) {
|
|
strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
strokePaint.setStyle(Paint.Style.STROKE);
|
|
strokePaint.setStrokeWidth(AndroidUtilities.dpf2(1.2f));
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void start() {
|
|
lastUpdateTime = System.currentTimeMillis();
|
|
started = true;
|
|
invalidateSelf();
|
|
}
|
|
|
|
@Override
|
|
public void stop() {
|
|
started = false;
|
|
}
|
|
|
|
@Override
|
|
public void setIsChat(boolean value) {
|
|
this.isChat = value;
|
|
}
|
|
|
|
@Override
|
|
public void setColor(int color) {
|
|
fillPaint.setColor(color);
|
|
strokePaint.setColor(color);
|
|
}
|
|
|
|
@Override
|
|
public void draw(@NonNull Canvas canvas) {
|
|
float animationProgress = Math.min(progress, 1f);
|
|
float k = 0.3f;
|
|
float p = CubicBezierInterpolator.EASE_IN.getInterpolation(animationProgress < k ? animationProgress / k : 1f);
|
|
float p2 = CubicBezierInterpolator.EASE_OUT.getInterpolation(animationProgress < k ? 0 : (animationProgress - k) / (1f - k));
|
|
float cx, xOffset;
|
|
if (increment) {
|
|
cx = AndroidUtilities.dp(2.1f) * p + (AndroidUtilities.dp(7) - AndroidUtilities.dp(2.1f)) * (1f - p);
|
|
xOffset = AndroidUtilities.dpf2(1.5f) * (1f - CubicBezierInterpolator.EASE_OUT.getInterpolation(progress / 2));
|
|
} else {
|
|
cx = AndroidUtilities.dp(2.1f) * (1f - p) + (AndroidUtilities.dp(7) - AndroidUtilities.dp(2.1f)) * p;
|
|
xOffset = AndroidUtilities.dpf2(1.5f) * CubicBezierInterpolator.EASE_OUT_QUINT.getInterpolation(progress / 2);
|
|
}
|
|
float cy = AndroidUtilities.dp(11) / 2f;
|
|
float r = AndroidUtilities.dpf2(2f);
|
|
|
|
float scaleOffset = AndroidUtilities.dpf2(0.5f) * p - AndroidUtilities.dpf2(0.5f) * p2;
|
|
|
|
Paint strokePaint = this.strokePaint != null ? this.strokePaint : Theme.chat_statusRecordPaint;
|
|
Paint paint = this.fillPaint != null ? this.fillPaint : Theme.chat_statusPaint;
|
|
if (strokePaint.getStrokeWidth() != AndroidUtilities.dp(0.8f)) {
|
|
strokePaint.setStrokeWidth(AndroidUtilities.dp(0.8f));
|
|
}
|
|
for (int i = 0; i < 2; i++) {
|
|
canvas.save();
|
|
canvas.translate(strokePaint.getStrokeWidth() / 2f + xOffset + AndroidUtilities.dp(9) * i + getBounds().left + AndroidUtilities.dpf2(0.2f), strokePaint.getStrokeWidth() / 2f + AndroidUtilities.dpf2(2f) + getBounds().top);
|
|
|
|
AndroidUtilities.rectTmp.set(0, scaleOffset, AndroidUtilities.dp(7), AndroidUtilities.dp(11) - scaleOffset);
|
|
canvas.drawOval(AndroidUtilities.rectTmp, strokePaint);
|
|
canvas.drawCircle(cx, cy, r, paint);
|
|
canvas.restore();
|
|
}
|
|
|
|
if (started) {
|
|
update();
|
|
}
|
|
}
|
|
|
|
private void update() {
|
|
long newTime = System.currentTimeMillis();
|
|
long dt = newTime - lastUpdateTime;
|
|
lastUpdateTime = newTime;
|
|
if (dt > 16) {
|
|
dt = 16;
|
|
}
|
|
progress += dt / 500f;
|
|
if (progress >= 2f) {
|
|
progress = 0;
|
|
increment = !increment;
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
|
|
@Override
|
|
public void setAlpha(int i) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public void setColorFilter(@Nullable ColorFilter colorFilter) {
|
|
|
|
}
|
|
|
|
@Override
|
|
public int getOpacity() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public int getIntrinsicWidth() {
|
|
return AndroidUtilities.dp(20);
|
|
}
|
|
|
|
@Override
|
|
public int getIntrinsicHeight() {
|
|
return AndroidUtilities.dp(18);
|
|
}
|
|
}
|