NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/PlayPauseDrawable.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;
}
}