NekoX/TMessagesProj/src/main/java/org/telegram/ui/Components/SimpleAvatarView.java

141 lines
4.3 KiB
Java

package org.telegram.ui.Components;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.messenger.ImageReceiver;
import org.telegram.tgnet.TLObject;
import org.telegram.ui.ActionBar.Theme;
public class SimpleAvatarView extends View {
public final static int SELECT_ANIMATION_DURATION = 200;
private ImageReceiver avatarImage = new ImageReceiver(this);
private AvatarDrawable avatarDrawable = new AvatarDrawable();
private Paint selectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float selectProgress;
private boolean isAvatarHidden;
private ValueAnimator animator;
public SimpleAvatarView(Context context) {
super(context);
}
public SimpleAvatarView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public SimpleAvatarView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
{
avatarImage.setRoundRadius(AndroidUtilities.dp(28));
selectPaint.setStrokeWidth(AndroidUtilities.dp(2));
selectPaint.setStyle(Paint.Style.STROKE);
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
avatarImage.onAttachedToWindow();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
avatarImage.onDetachedFromWindow();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.save();
float scale = 0.9f + selectProgress * 0.1f;
canvas.scale(scale, scale);
selectPaint.setColor(Theme.getColor(Theme.key_dialogTextBlue));
selectPaint.setAlpha((int) (Color.alpha(selectPaint.getColor()) * selectProgress));
float stroke = selectPaint.getStrokeWidth();
AndroidUtilities.rectTmp.set(stroke, stroke, getWidth() - stroke, getHeight() - stroke);
canvas.drawArc(AndroidUtilities.rectTmp, -90, selectProgress * 360, false, selectPaint);
canvas.restore();
if (!isAvatarHidden) {
float pad = selectPaint.getStrokeWidth() * 2.5f * selectProgress;
avatarImage.setImageCoords(pad, pad, getWidth() - pad * 2, getHeight() - pad * 2);
avatarImage.draw(canvas);
}
}
/**
* Sets new User or Chat to be bound as the avatar
* @param obj User or chat
*/
public void setAvatar(TLObject obj) {
avatarDrawable.setInfo(obj);
avatarImage.setForUserOrChat(obj, avatarDrawable);
}
/**
* @return If avatar is currently selected
*/
public boolean isSelected() {
return selectProgress == 1;
}
/**
* Sets avatar selected value
* @param s If avatar is selected
* @param animate If we should animate status change
*/
public void setSelected(boolean s, boolean animate) {
if (animator != null) {
animator.cancel();
}
if (animate) {
float to = s ? 1 : 0;
ValueAnimator anim = ValueAnimator.ofFloat(selectProgress, to).setDuration(SELECT_ANIMATION_DURATION);
anim.setInterpolator(CubicBezierInterpolator.DEFAULT);
anim.addUpdateListener(animation -> {
selectProgress = (float) animation.getAnimatedValue();
invalidate();
});
anim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
if (animator == animation) {
animator = null;
}
}
});
anim.start();
animator = anim;
} else {
selectProgress = s ? 1 : 0;
invalidate();
}
}
/**
* Sets avatar hidden
* @param h If we should hide avatar from view
*/
public void setHideAvatar(boolean h) {
isAvatarHidden = h;
invalidate();
}
}