mirror of https://github.com/NekoX-Dev/NekoX.git
157 lines
4.9 KiB
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;
|
|
}
|
|
}
|