mirror of
https://github.com/Pinball3D/Rabbit-R1.git
synced 2025-01-09 13:43:22 +00:00
230 lines
8.6 KiB
Java
230 lines
8.6 KiB
Java
package com.google.android.material.circularreveal;
|
|
|
|
import android.graphics.Bitmap;
|
|
import android.graphics.BitmapShader;
|
|
import android.graphics.Canvas;
|
|
import android.graphics.Color;
|
|
import android.graphics.Paint;
|
|
import android.graphics.Path;
|
|
import android.graphics.Rect;
|
|
import android.graphics.Shader;
|
|
import android.graphics.drawable.Drawable;
|
|
import android.view.View;
|
|
import androidx.core.internal.view.SupportMenu;
|
|
import androidx.core.view.ViewCompat;
|
|
import com.google.android.material.circularreveal.CircularRevealWidget;
|
|
import com.google.android.material.math.MathUtils;
|
|
import java.lang.annotation.Retention;
|
|
import java.lang.annotation.RetentionPolicy;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public class CircularRevealHelper {
|
|
public static final int BITMAP_SHADER = 0;
|
|
public static final int CLIP_PATH = 1;
|
|
private static final boolean DEBUG = false;
|
|
public static final int REVEAL_ANIMATOR = 2;
|
|
public static final int STRATEGY = 2;
|
|
private boolean buildingCircularRevealCache;
|
|
private Paint debugPaint;
|
|
private final Delegate delegate;
|
|
private boolean hasCircularRevealCache;
|
|
private Drawable overlayDrawable;
|
|
private CircularRevealWidget.RevealInfo revealInfo;
|
|
private final Paint revealPaint;
|
|
private final Path revealPath;
|
|
private final Paint scrimPaint;
|
|
private final View view;
|
|
|
|
/* loaded from: classes2.dex */
|
|
public interface Delegate {
|
|
void actualDraw(Canvas canvas);
|
|
|
|
boolean actualIsOpaque();
|
|
}
|
|
|
|
@Retention(RetentionPolicy.SOURCE)
|
|
/* loaded from: classes2.dex */
|
|
public @interface Strategy {
|
|
}
|
|
|
|
private boolean shouldDrawOverlayDrawable() {
|
|
return (this.buildingCircularRevealCache || this.overlayDrawable == null || this.revealInfo == null) ? false : true;
|
|
}
|
|
|
|
public Drawable getCircularRevealOverlayDrawable() {
|
|
return this.overlayDrawable;
|
|
}
|
|
|
|
/* JADX WARN: Multi-variable type inference failed */
|
|
public CircularRevealHelper(Delegate delegate) {
|
|
this.delegate = delegate;
|
|
View view = (View) delegate;
|
|
this.view = view;
|
|
view.setWillNotDraw(false);
|
|
this.revealPath = new Path();
|
|
this.revealPaint = new Paint(7);
|
|
Paint paint = new Paint(1);
|
|
this.scrimPaint = paint;
|
|
paint.setColor(0);
|
|
}
|
|
|
|
public void buildCircularRevealCache() {
|
|
if (STRATEGY == 0) {
|
|
this.buildingCircularRevealCache = true;
|
|
this.hasCircularRevealCache = false;
|
|
this.view.buildDrawingCache();
|
|
Bitmap drawingCache = this.view.getDrawingCache();
|
|
if (drawingCache == null && this.view.getWidth() != 0 && this.view.getHeight() != 0) {
|
|
drawingCache = Bitmap.createBitmap(this.view.getWidth(), this.view.getHeight(), Bitmap.Config.ARGB_8888);
|
|
this.view.draw(new Canvas(drawingCache));
|
|
}
|
|
if (drawingCache != null) {
|
|
this.revealPaint.setShader(new BitmapShader(drawingCache, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
|
|
}
|
|
this.buildingCircularRevealCache = false;
|
|
this.hasCircularRevealCache = true;
|
|
}
|
|
}
|
|
|
|
public void destroyCircularRevealCache() {
|
|
if (STRATEGY == 0) {
|
|
this.hasCircularRevealCache = false;
|
|
this.view.destroyDrawingCache();
|
|
this.revealPaint.setShader(null);
|
|
this.view.invalidate();
|
|
}
|
|
}
|
|
|
|
public void setRevealInfo(CircularRevealWidget.RevealInfo revealInfo) {
|
|
if (revealInfo == null) {
|
|
this.revealInfo = null;
|
|
} else {
|
|
CircularRevealWidget.RevealInfo revealInfo2 = this.revealInfo;
|
|
if (revealInfo2 == null) {
|
|
this.revealInfo = new CircularRevealWidget.RevealInfo(revealInfo);
|
|
} else {
|
|
revealInfo2.set(revealInfo);
|
|
}
|
|
if (MathUtils.geq(revealInfo.radius, getDistanceToFurthestCorner(revealInfo), 1.0E-4f)) {
|
|
this.revealInfo.radius = Float.MAX_VALUE;
|
|
}
|
|
}
|
|
invalidateRevealInfo();
|
|
}
|
|
|
|
public CircularRevealWidget.RevealInfo getRevealInfo() {
|
|
if (this.revealInfo == null) {
|
|
return null;
|
|
}
|
|
CircularRevealWidget.RevealInfo revealInfo = new CircularRevealWidget.RevealInfo(this.revealInfo);
|
|
if (revealInfo.isInvalid()) {
|
|
revealInfo.radius = getDistanceToFurthestCorner(revealInfo);
|
|
}
|
|
return revealInfo;
|
|
}
|
|
|
|
public void setCircularRevealScrimColor(int i) {
|
|
this.scrimPaint.setColor(i);
|
|
this.view.invalidate();
|
|
}
|
|
|
|
public int getCircularRevealScrimColor() {
|
|
return this.scrimPaint.getColor();
|
|
}
|
|
|
|
public void setCircularRevealOverlayDrawable(Drawable drawable) {
|
|
this.overlayDrawable = drawable;
|
|
this.view.invalidate();
|
|
}
|
|
|
|
private void invalidateRevealInfo() {
|
|
if (STRATEGY == 1) {
|
|
this.revealPath.rewind();
|
|
CircularRevealWidget.RevealInfo revealInfo = this.revealInfo;
|
|
if (revealInfo != null) {
|
|
this.revealPath.addCircle(revealInfo.centerX, this.revealInfo.centerY, this.revealInfo.radius, Path.Direction.CW);
|
|
}
|
|
}
|
|
this.view.invalidate();
|
|
}
|
|
|
|
private float getDistanceToFurthestCorner(CircularRevealWidget.RevealInfo revealInfo) {
|
|
return MathUtils.distanceToFurthestCorner(revealInfo.centerX, revealInfo.centerY, 0.0f, 0.0f, this.view.getWidth(), this.view.getHeight());
|
|
}
|
|
|
|
public void draw(Canvas canvas) {
|
|
if (shouldDrawCircularReveal()) {
|
|
int i = STRATEGY;
|
|
if (i == 0) {
|
|
canvas.drawCircle(this.revealInfo.centerX, this.revealInfo.centerY, this.revealInfo.radius, this.revealPaint);
|
|
if (shouldDrawScrim()) {
|
|
canvas.drawCircle(this.revealInfo.centerX, this.revealInfo.centerY, this.revealInfo.radius, this.scrimPaint);
|
|
}
|
|
} else if (i == 1) {
|
|
int save = canvas.save();
|
|
canvas.clipPath(this.revealPath);
|
|
this.delegate.actualDraw(canvas);
|
|
if (shouldDrawScrim()) {
|
|
canvas.drawRect(0.0f, 0.0f, this.view.getWidth(), this.view.getHeight(), this.scrimPaint);
|
|
}
|
|
canvas.restoreToCount(save);
|
|
} else if (i == 2) {
|
|
this.delegate.actualDraw(canvas);
|
|
if (shouldDrawScrim()) {
|
|
canvas.drawRect(0.0f, 0.0f, this.view.getWidth(), this.view.getHeight(), this.scrimPaint);
|
|
}
|
|
} else {
|
|
throw new IllegalStateException("Unsupported strategy " + i);
|
|
}
|
|
} else {
|
|
this.delegate.actualDraw(canvas);
|
|
if (shouldDrawScrim()) {
|
|
canvas.drawRect(0.0f, 0.0f, this.view.getWidth(), this.view.getHeight(), this.scrimPaint);
|
|
}
|
|
}
|
|
drawOverlayDrawable(canvas);
|
|
}
|
|
|
|
private void drawOverlayDrawable(Canvas canvas) {
|
|
if (shouldDrawOverlayDrawable()) {
|
|
Rect bounds = this.overlayDrawable.getBounds();
|
|
float width = this.revealInfo.centerX - (bounds.width() / 2.0f);
|
|
float height = this.revealInfo.centerY - (bounds.height() / 2.0f);
|
|
canvas.translate(width, height);
|
|
this.overlayDrawable.draw(canvas);
|
|
canvas.translate(-width, -height);
|
|
}
|
|
}
|
|
|
|
public boolean isOpaque() {
|
|
return this.delegate.actualIsOpaque() && !shouldDrawCircularReveal();
|
|
}
|
|
|
|
private boolean shouldDrawCircularReveal() {
|
|
CircularRevealWidget.RevealInfo revealInfo = this.revealInfo;
|
|
boolean z = revealInfo == null || revealInfo.isInvalid();
|
|
return STRATEGY == 0 ? !z && this.hasCircularRevealCache : !z;
|
|
}
|
|
|
|
private boolean shouldDrawScrim() {
|
|
return (this.buildingCircularRevealCache || Color.alpha(this.scrimPaint.getColor()) == 0) ? false : true;
|
|
}
|
|
|
|
private void drawDebugMode(Canvas canvas) {
|
|
this.delegate.actualDraw(canvas);
|
|
if (shouldDrawScrim()) {
|
|
canvas.drawCircle(this.revealInfo.centerX, this.revealInfo.centerY, this.revealInfo.radius, this.scrimPaint);
|
|
}
|
|
if (shouldDrawCircularReveal()) {
|
|
drawDebugCircle(canvas, ViewCompat.MEASURED_STATE_MASK, 10.0f);
|
|
drawDebugCircle(canvas, SupportMenu.CATEGORY_MASK, 5.0f);
|
|
}
|
|
drawOverlayDrawable(canvas);
|
|
}
|
|
|
|
private void drawDebugCircle(Canvas canvas, int i, float f) {
|
|
this.debugPaint.setColor(i);
|
|
this.debugPaint.setStrokeWidth(f);
|
|
canvas.drawCircle(this.revealInfo.centerX, this.revealInfo.centerY, this.revealInfo.radius - (f / 2.0f), this.debugPaint);
|
|
}
|
|
}
|