NekoX/TMessagesProj/src/main/java/org/telegram/ui/VoiceMessageEnterTransition...

175 lines
6.9 KiB
Java
Raw Normal View History

2021-03-19 11:25:58 +01:00
package org.telegram.ui;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.graphics.Canvas;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Shader;
2021-07-15 16:24:57 +02:00
import android.transition.Transition;
2021-03-19 11:25:58 +01:00
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.FrameLayout;
import androidx.core.graphics.ColorUtils;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.ui.ActionBar.Theme;
import org.telegram.ui.Cells.ChatMessageCell;
import org.telegram.ui.Components.ChatActivityEnterView;
import org.telegram.ui.Components.CubicBezierInterpolator;
import org.telegram.ui.Components.RecyclerListView;
2021-07-15 16:24:57 +02:00
public class VoiceMessageEnterTransition implements MessageEnterTransitionContainer.Transition {
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
private final ChatMessageCell messageView;
private final RecyclerListView listView;
2021-03-19 11:25:58 +01:00
float fromRadius;
float progress;
final Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private final ValueAnimator animator;
2021-07-15 16:24:57 +02:00
private final ChatActivityEnterView.RecordCircle recordCircle;
private final Matrix gradientMatrix;
private final Paint gradientPaint;
private final LinearGradient gradientShader;
private final int messageId;
MessageEnterTransitionContainer container;
2021-09-20 07:54:41 +02:00
private final Theme.ResourcesProvider resourcesProvider;
2021-07-15 16:24:57 +02:00
2021-09-20 07:54:41 +02:00
public VoiceMessageEnterTransition(ChatMessageCell messageView, ChatActivityEnterView chatActivityEnterView, RecyclerListView listView, MessageEnterTransitionContainer container, Theme.ResourcesProvider resourcesProvider) {
this.resourcesProvider = resourcesProvider;
2021-07-15 16:24:57 +02:00
this.messageView = messageView;
this.container = container;
this.listView = listView;
2021-03-19 11:25:58 +01:00
fromRadius = chatActivityEnterView.getRecordCicle().drawingCircleRadius;
2021-07-15 16:24:57 +02:00
messageView.setEnterTransitionInProgress(true);
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
recordCircle = chatActivityEnterView.getRecordCicle();
2021-03-19 11:25:58 +01:00
recordCircle.voiceEnterTransitionInProgress = true;
recordCircle.skipDraw = true;
2021-07-15 16:24:57 +02:00
gradientMatrix = new Matrix();
gradientPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
2021-03-19 11:25:58 +01:00
gradientPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
2021-07-15 16:24:57 +02:00
gradientShader = new LinearGradient(0, AndroidUtilities.dp(12), 0, 0, 0, 0xFF000000, Shader.TileMode.CLAMP);
2021-03-19 11:25:58 +01:00
gradientPaint.setShader(gradientShader);
2021-07-15 16:24:57 +02:00
messageId = messageView.getMessageObject().stableId;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
container.addTransition(this);
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
animator = ValueAnimator.ofFloat(0f, 1f);
animator.addUpdateListener(valueAnimator -> {
progress = (float) valueAnimator.getAnimatedValue();
container.invalidate();
});
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(220);
animator.addListener(new AnimatorListenerAdapter() {
2021-03-19 11:25:58 +01:00
@Override
2021-07-15 16:24:57 +02:00
public void onAnimationEnd(Animator animation) {
messageView.setEnterTransitionInProgress(false);
container.removeTransition(VoiceMessageEnterTransition.this);
recordCircle.skipDraw = false;
}
});
2022-06-21 04:51:00 +02:00
if (messageView.getSeekBarWaveform() != null) {
messageView.getSeekBarWaveform().setSent();
}
2021-07-15 16:24:57 +02:00
}
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
public void start() {
animator.start();
}
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float lastToCx;
float lastToCy;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
@Override
public void onDraw(Canvas canvas) {
float step1Time = 0.6f;
float moveProgress = progress;
float hideWavesProgress = progress > step1Time ? 1f : progress / step1Time;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float fromCx = recordCircle.drawingCx + recordCircle.getX() - container.getX();
float fromCy = recordCircle.drawingCy + recordCircle.getY() - container.getY();
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float toCy;
float toCx;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
if (messageView.getMessageObject().stableId != messageId) {
toCx = lastToCx;
toCy = lastToCy;
} else {
toCy = messageView.getRadialProgress().getProgressRect().centerY() + messageView.getY() + listView.getY() - container.getY();
toCx = messageView.getRadialProgress().getProgressRect().centerX() + messageView.getX() + listView.getX() - container.getX();
}
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
lastToCx = toCx;
lastToCy = toCy;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float progress = CubicBezierInterpolator.DEFAULT.getInterpolation(moveProgress);
float xProgress = CubicBezierInterpolator.EASE_OUT_QUINT.getInterpolation(moveProgress);
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float cx = fromCx * (1f - xProgress) + toCx * xProgress;
float cy = fromCy * (1f - progress) + toCy * progress;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float toRadius = messageView.getRadialProgress().getProgressRect().height() / 2;
float radius = fromRadius * (1f - progress) + toRadius * progress;
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float listViewBottom = listView.getY() - container.getY() + listView.getMeasuredHeight();
int clipBottom = 0;
if (container.getMeasuredHeight() > 0) {
clipBottom = (int) (container.getMeasuredHeight() * (1f - progress) + listViewBottom * progress);
canvas.saveLayerAlpha(0, container.getMeasuredHeight() - AndroidUtilities.dp(400), container.getMeasuredWidth(), container.getMeasuredHeight(), 255, Canvas.ALL_SAVE_FLAG);
} else {
canvas.save();
}
2021-03-19 11:25:58 +01:00
2021-09-20 07:54:41 +02:00
circlePaint.setColor(ColorUtils.blendARGB(getThemedColor(Theme.key_chat_messagePanelVoiceBackground), getThemedColor(messageView.getRadialProgress().getCircleColorKey()), progress));
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
recordCircle.drawWaves(canvas, cx, cy, 1f - hideWavesProgress);
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
canvas.drawCircle(cx, cy, radius, circlePaint);
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
canvas.save();
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
float scale = radius / toRadius;
canvas.scale(scale, scale, cx, cy);
canvas.translate(cx - messageView.getRadialProgress().getProgressRect().centerX(), cy - messageView.getRadialProgress().getProgressRect().centerY());
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
messageView.getRadialProgress().setOverrideAlpha(progress);
messageView.getRadialProgress().setDrawBackground(false);
messageView.getRadialProgress().draw(canvas);
messageView.getRadialProgress().setDrawBackground(true);
messageView.getRadialProgress().setOverrideAlpha(1f);
canvas.restore();
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
if (container.getMeasuredHeight() > 0) {
gradientMatrix.setTranslate(0, clipBottom);
gradientShader.setLocalMatrix(gradientMatrix);
canvas.drawRect(0, clipBottom, container.getMeasuredWidth(), container.getMeasuredHeight(), gradientPaint);
}
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
//restore clipRect
canvas.restore();
2021-03-19 11:25:58 +01:00
2021-07-15 16:24:57 +02:00
recordCircle.drawIcon(canvas, (int) fromCx, (int) fromCy, 1f - moveProgress);
2021-03-19 11:25:58 +01:00
}
2021-09-20 07:54:41 +02:00
private int getThemedColor(String key) {
Integer color = resourcesProvider != null ? resourcesProvider.getColor(key) : null;
return color != null ? color : Theme.getColor(key);
}
2021-03-19 11:25:58 +01:00
}