mirror of https://github.com/NekoX-Dev/NekoX.git
141 lines
3.9 KiB
Java
141 lines
3.9 KiB
Java
package org.telegram.ui.Components;
|
|
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Color;
|
|
import android.graphics.ColorFilter;
|
|
import android.graphics.Paint;
|
|
import android.graphics.PixelFormat;
|
|
import android.graphics.Rect;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.view.View;
|
|
import android.view.animation.AnimationUtils;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
|
|
import org.telegram.messenger.AndroidUtilities;
|
|
import org.telegram.ui.ActionBar.Theme;
|
|
|
|
public class PlayPauseDrawable extends Drawable {
|
|
|
|
private final Paint paint;
|
|
private final int size;
|
|
|
|
private boolean pause;
|
|
private float progress;
|
|
private long lastUpdateTime;
|
|
|
|
private View parent;
|
|
|
|
private int alpha = 255;
|
|
|
|
float duration = 300f;
|
|
|
|
public PlayPauseDrawable(int size) {
|
|
this.size = AndroidUtilities.dp(size);
|
|
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
|
|
paint.setColor(Color.WHITE);
|
|
}
|
|
|
|
@Override
|
|
public void draw(@NonNull Canvas canvas) {
|
|
long newUpdateTime = AnimationUtils.currentAnimationTimeMillis();
|
|
long dt = newUpdateTime - lastUpdateTime;
|
|
lastUpdateTime = newUpdateTime;
|
|
if (dt > 18) {
|
|
dt = 16;
|
|
}
|
|
if (pause && progress < 1f) {
|
|
progress += dt / duration;
|
|
if (progress >= 1f) {
|
|
progress = 1f;
|
|
} else {
|
|
if (parent != null) {
|
|
parent.invalidate();
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
} else if (!pause && progress > 0f) {
|
|
progress -= dt / duration;
|
|
if (progress <= 0f) {
|
|
progress = 0f;
|
|
} else {
|
|
if (parent != null) {
|
|
parent.invalidate();
|
|
}
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
final Rect bounds = getBounds();
|
|
if (alpha == 255) {
|
|
canvas.save();
|
|
} else {
|
|
canvas.saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, alpha, Canvas.ALL_SAVE_FLAG);
|
|
}
|
|
canvas.translate(bounds.centerX() + AndroidUtilities.dp(1) * (1.0f - progress), bounds.centerY());
|
|
final float ms = 500.0f * progress;
|
|
final float rotation;
|
|
if (ms < 100) {
|
|
rotation = -5 * CubicBezierInterpolator.EASE_BOTH.getInterpolation(ms / 100.0f);
|
|
} else if (ms < 484) {
|
|
rotation = -5 + 95 * CubicBezierInterpolator.EASE_BOTH.getInterpolation((ms - 100) / 384);
|
|
} else {
|
|
rotation = 90;
|
|
}
|
|
canvas.scale(1.45f * size / AndroidUtilities.dp(28), 1.5f * size / AndroidUtilities.dp(28));
|
|
canvas.rotate(rotation);
|
|
Theme.playPauseAnimator.draw(canvas, paint, ms);
|
|
canvas.scale(1.0f, -1.0f);
|
|
Theme.playPauseAnimator.draw(canvas, paint, ms);
|
|
canvas.restore();
|
|
}
|
|
|
|
public void setPause(boolean pause) {
|
|
setPause(pause, true);
|
|
}
|
|
|
|
public void setPause(boolean pause, boolean animated) {
|
|
if (this.pause != pause) {
|
|
this.pause = pause;
|
|
if (!animated) {
|
|
progress = pause ? 1f : 0f;
|
|
}
|
|
this.lastUpdateTime = AnimationUtils.currentAnimationTimeMillis();
|
|
invalidateSelf();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void setAlpha(int i) {
|
|
alpha = i;
|
|
}
|
|
|
|
@Override
|
|
public void setColorFilter(@Nullable ColorFilter colorFilter) {
|
|
paint.setColorFilter(colorFilter);
|
|
}
|
|
|
|
@Override
|
|
public int getOpacity() {
|
|
return PixelFormat.TRANSPARENT;
|
|
}
|
|
|
|
@Override
|
|
public int getIntrinsicWidth() {
|
|
return size;
|
|
}
|
|
|
|
@Override
|
|
public int getIntrinsicHeight() {
|
|
return size;
|
|
}
|
|
|
|
public void setParent(View parent) {
|
|
this.parent = parent;
|
|
}
|
|
|
|
public void setDuration(int duration) {
|
|
this.duration = duration;
|
|
}
|
|
}
|