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

157 lines
4.9 KiB
Java

package org.telegram.ui.Components;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import org.telegram.messenger.AndroidUtilities;
import org.telegram.ui.ActionBar.Theme;
public class CrossOutDrawable extends Drawable {
Drawable iconDrawable;
RectF rectF = new RectF();
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
final Paint xRefPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
int color;
String colorKey;
float progress;
boolean cross;
private float xOffset;
private float lenOffsetTop;
private float lenOffsetBottom;
public CrossOutDrawable(Context context, int iconRes, String colorKey) {
iconDrawable = ContextCompat.getDrawable(context, iconRes);
this.colorKey = colorKey;
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(AndroidUtilities.dpf2(1.7f));
paint.setStrokeCap(Paint.Cap.ROUND);
xRefPaint.setColor(0xff000000);
xRefPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
xRefPaint.setStyle(Paint.Style.STROKE);
xRefPaint.setStrokeWidth(AndroidUtilities.dpf2(2.5f));
}
public void setCrossOut(boolean cross, boolean animated) {
if (this.cross != cross) {
this.cross = cross;
if (!animated) {
progress = cross ? 1f : 0f;
} else {
progress = cross ? 0f : 1f;
}
invalidateSelf();
}
}
@Override
public void draw(@NonNull Canvas canvas) {
if (cross && progress != 1f) {
progress += 16f / 150f;
invalidateSelf();
if (progress > 1f) {
progress = 1f;
}
} else if (!cross && progress != 0f) {
progress -= 16f / 150f;
invalidateSelf();
if (progress < 0) {
progress = 0;
}
}
int newColor = colorKey == null ? Color.WHITE : Theme.getColor(colorKey);
if (color != newColor) {
color = newColor;
paint.setColor(newColor);
iconDrawable.setColorFilter(new PorterDuffColorFilter(newColor, PorterDuff.Mode.MULTIPLY));
}
if (progress == 0) {
iconDrawable.draw(canvas);
return;
}
rectF.set(iconDrawable.getBounds());
canvas.saveLayerAlpha(rectF, 255, Canvas.ALL_SAVE_FLAG);
iconDrawable.draw(canvas);
float startX = rectF.left + AndroidUtilities.dpf2(4.5f) + xOffset + lenOffsetTop;
float startY = rectF.top + AndroidUtilities.dpf2(4.5f) - AndroidUtilities.dp(1) + lenOffsetTop;
float stopX = rectF.right - AndroidUtilities.dp(3) + xOffset - lenOffsetBottom;
float stopY = rectF.bottom - AndroidUtilities.dp(1) - AndroidUtilities.dp(3) - lenOffsetBottom;
if (cross) {
stopX = startX + (stopX - startX) * progress;
stopY = startY + (stopY - startY) * progress;
} else {
startX = startX + (stopX - startX) * (1f - progress);
startY = startY + (stopY - startY) * (1f - progress);
}
canvas.drawLine(startX, startY - paint.getStrokeWidth(), stopX, stopY - paint.getStrokeWidth(), xRefPaint);
canvas.drawLine(startX, startY, stopX, stopY, paint);
canvas.restore();
}
@Override
public void setAlpha(int i) {
}
@Override
public void setColorFilter(@Nullable ColorFilter colorFilter) {
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
iconDrawable.setBounds(left, top, right, bottom);
}
@Override
public int getIntrinsicHeight() {
return iconDrawable.getIntrinsicHeight();
}
@Override
public int getIntrinsicWidth() {
return iconDrawable.getIntrinsicWidth();
}
@Override
public int getOpacity() {
return PixelFormat.TRANSPARENT;
}
public void setColorKey(String colorKey) {
this.colorKey = colorKey;
}
public void setOffsets(float xOffset, float lenOffsetTop, float lenOffsetBottom) {
this.xOffset = xOffset;
this.lenOffsetTop = lenOffsetTop;
this.lenOffsetBottom = lenOffsetBottom;
invalidateSelf();
}
public void setStrokeWidth(float w) {
paint.setStrokeWidth(w);
xRefPaint.setStrokeWidth(w * 1.47f);
}
public float getProgress() {
return progress;
}
}