mirror of https://github.com/NekoX-Dev/NekoX.git
108 lines
2.8 KiB
Java
108 lines
2.8 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Matrix;
|
|
import android.graphics.Paint;
|
|
import android.graphics.Path;
|
|
|
|
import java.util.Random;
|
|
|
|
public class CircleBezierDrawable {
|
|
|
|
private Path path = new Path();
|
|
private float[] pointStart = new float[4];
|
|
private float[] pointEnd = new float[4];
|
|
private Matrix m = new Matrix();
|
|
private final float L;
|
|
private final int N;
|
|
|
|
float globalRotate = 0f;
|
|
public float idleStateDiff = 0f;
|
|
public float radius;
|
|
public float radiusDiff;
|
|
public float cubicBezierK = 1f;
|
|
|
|
final Random random = new Random();
|
|
|
|
float[] randomAdditionals;
|
|
|
|
public float randomK;
|
|
|
|
public CircleBezierDrawable(int n) {
|
|
N = n;
|
|
L = (float) ((4.0 / 3.0) * Math.tan(Math.PI / (2 * N)));
|
|
randomAdditionals = new float[n];
|
|
calculateRandomAdditionals();
|
|
}
|
|
|
|
public void calculateRandomAdditionals() {
|
|
for (int i = 0; i < N; i++) {
|
|
randomAdditionals[i] = random.nextInt() % 100 / 100f;
|
|
}
|
|
}
|
|
|
|
public void setAdditionals(int[] additionals) {
|
|
for (int i = 0; i < N; i += 2) {
|
|
randomAdditionals[i] = additionals[i / 2];
|
|
randomAdditionals[i + 1] = 0;
|
|
}
|
|
}
|
|
|
|
public void draw(float cX, float cY, Canvas canvas, Paint paint) {
|
|
float r1 = radius - idleStateDiff / 2f - radiusDiff / 2f;
|
|
float r2 = radius + radiusDiff / 2 + idleStateDiff / 2f;
|
|
|
|
float l = L * Math.max(r1, r2) * cubicBezierK;
|
|
|
|
path.reset();
|
|
for (int i = 0; i < N; i++) {
|
|
m.reset();
|
|
m.setRotate(360f / N * i, cX, cY);
|
|
float r = (i % 2 == 0 ? r1 : r2) + randomK * randomAdditionals[i];
|
|
|
|
pointStart[0] = cX;
|
|
pointStart[1] = cY - r;
|
|
pointStart[2] = cX + l + randomK * randomAdditionals[i] * L;
|
|
pointStart[3] = cY - r;
|
|
|
|
m.mapPoints(pointStart);
|
|
|
|
int j = i + 1;
|
|
if (j >= N) j = 0;
|
|
|
|
r = (j % 2 == 0 ? r1 : r2) + randomK * randomAdditionals[j];
|
|
|
|
|
|
pointEnd[0] = cX;
|
|
pointEnd[1] = cY - r;
|
|
pointEnd[2] = cX - l + randomK * randomAdditionals[j] * L;
|
|
pointEnd[3] = cY - r;
|
|
|
|
|
|
m.reset();
|
|
m.setRotate(360f / N * j, cX, cY);
|
|
|
|
m.mapPoints(pointEnd);
|
|
|
|
if (i == 0) {
|
|
path.moveTo(pointStart[0], pointStart[1]);
|
|
}
|
|
|
|
path.cubicTo(
|
|
pointStart[2], pointStart[3],
|
|
pointEnd[2], pointEnd[3],
|
|
pointEnd[0], pointEnd[1]
|
|
);
|
|
}
|
|
|
|
canvas.save();
|
|
canvas.rotate(globalRotate, cX, cY);
|
|
canvas.drawPath(path, paint);
|
|
canvas.restore();
|
|
}
|
|
|
|
public void setRandomAdditions(float randomK) {
|
|
this.randomK = randomK;
|
|
}
|
|
}
|