ADD week 5
This commit is contained in:
		| @@ -0,0 +1,307 @@ | ||||
| package androidx.cardview.widget; | ||||
|  | ||||
| import android.content.res.ColorStateList; | ||||
| import android.content.res.Resources; | ||||
| import android.graphics.Canvas; | ||||
| import android.graphics.ColorFilter; | ||||
| import android.graphics.LinearGradient; | ||||
| import android.graphics.Paint; | ||||
| import android.graphics.Path; | ||||
| import android.graphics.RadialGradient; | ||||
| import android.graphics.Rect; | ||||
| import android.graphics.RectF; | ||||
| import android.graphics.Shader; | ||||
| import android.graphics.drawable.Drawable; | ||||
| import androidx.cardview.R; | ||||
|  | ||||
| /* loaded from: classes.dex */ | ||||
| class RoundRectDrawableWithShadow extends Drawable { | ||||
|     private static final double COS_45 = Math.cos(Math.toRadians(45.0d)); | ||||
|     private static final float SHADOW_MULTIPLIER = 1.5f; | ||||
|     static RoundRectHelper sRoundRectHelper; | ||||
|     private ColorStateList mBackground; | ||||
|     private final RectF mCardBounds; | ||||
|     private float mCornerRadius; | ||||
|     private Paint mCornerShadowPaint; | ||||
|     private Path mCornerShadowPath; | ||||
|     private Paint mEdgeShadowPaint; | ||||
|     private final int mInsetShadow; | ||||
|     private float mRawMaxShadowSize; | ||||
|     private float mRawShadowSize; | ||||
|     private final int mShadowEndColor; | ||||
|     private float mShadowSize; | ||||
|     private final int mShadowStartColor; | ||||
|     private boolean mDirty = true; | ||||
|     private boolean mAddPaddingForCorners = true; | ||||
|     private boolean mPrintedShadowClipWarning = false; | ||||
|     private Paint mPaint = new Paint(5); | ||||
|  | ||||
|     interface RoundRectHelper { | ||||
|         void drawRoundRect(Canvas canvas, RectF rectF, float f, Paint paint); | ||||
|     } | ||||
|  | ||||
|     static float calculateHorizontalPadding(float f, float f2, boolean z) { | ||||
|         return z ? (float) (f + ((1.0d - COS_45) * f2)) : f; | ||||
|     } | ||||
|  | ||||
|     static float calculateVerticalPadding(float f, float f2, boolean z) { | ||||
|         return z ? (float) ((f * SHADOW_MULTIPLIER) + ((1.0d - COS_45) * f2)) : f * SHADOW_MULTIPLIER; | ||||
|     } | ||||
|  | ||||
|     ColorStateList getColor() { | ||||
|         return this.mBackground; | ||||
|     } | ||||
|  | ||||
|     float getCornerRadius() { | ||||
|         return this.mCornerRadius; | ||||
|     } | ||||
|  | ||||
|     float getMaxShadowSize() { | ||||
|         return this.mRawMaxShadowSize; | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     public int getOpacity() { | ||||
|         return -3; | ||||
|     } | ||||
|  | ||||
|     float getShadowSize() { | ||||
|         return this.mRawShadowSize; | ||||
|     } | ||||
|  | ||||
|     RoundRectDrawableWithShadow(Resources resources, ColorStateList colorStateList, float f, float f2, float f3) { | ||||
|         this.mShadowStartColor = resources.getColor(R.color.cardview_shadow_start_color); | ||||
|         this.mShadowEndColor = resources.getColor(R.color.cardview_shadow_end_color); | ||||
|         this.mInsetShadow = resources.getDimensionPixelSize(R.dimen.cardview_compat_inset_shadow); | ||||
|         setBackground(colorStateList); | ||||
|         Paint paint = new Paint(5); | ||||
|         this.mCornerShadowPaint = paint; | ||||
|         paint.setStyle(Paint.Style.FILL); | ||||
|         this.mCornerRadius = (int) (f + 0.5f); | ||||
|         this.mCardBounds = new RectF(); | ||||
|         Paint paint2 = new Paint(this.mCornerShadowPaint); | ||||
|         this.mEdgeShadowPaint = paint2; | ||||
|         paint2.setAntiAlias(false); | ||||
|         setShadowSize(f2, f3); | ||||
|     } | ||||
|  | ||||
|     private void setBackground(ColorStateList colorStateList) { | ||||
|         if (colorStateList == null) { | ||||
|             colorStateList = ColorStateList.valueOf(0); | ||||
|         } | ||||
|         this.mBackground = colorStateList; | ||||
|         this.mPaint.setColor(colorStateList.getColorForState(getState(), this.mBackground.getDefaultColor())); | ||||
|     } | ||||
|  | ||||
|     private int toEven(float f) { | ||||
|         int i = (int) (f + 0.5f); | ||||
|         return i % 2 == 1 ? i - 1 : i; | ||||
|     } | ||||
|  | ||||
|     void setAddPaddingForCorners(boolean z) { | ||||
|         this.mAddPaddingForCorners = z; | ||||
|         invalidateSelf(); | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     public void setAlpha(int i) { | ||||
|         this.mPaint.setAlpha(i); | ||||
|         this.mCornerShadowPaint.setAlpha(i); | ||||
|         this.mEdgeShadowPaint.setAlpha(i); | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     protected void onBoundsChange(Rect rect) { | ||||
|         super.onBoundsChange(rect); | ||||
|         this.mDirty = true; | ||||
|     } | ||||
|  | ||||
|     private void setShadowSize(float f, float f2) { | ||||
|         if (f < 0.0f) { | ||||
|             throw new IllegalArgumentException("Invalid shadow size " + f + ". Must be >= 0"); | ||||
|         } | ||||
|         if (f2 < 0.0f) { | ||||
|             throw new IllegalArgumentException("Invalid max shadow size " + f2 + ". Must be >= 0"); | ||||
|         } | ||||
|         float even = toEven(f); | ||||
|         float even2 = toEven(f2); | ||||
|         if (even > even2) { | ||||
|             if (!this.mPrintedShadowClipWarning) { | ||||
|                 this.mPrintedShadowClipWarning = true; | ||||
|             } | ||||
|             even = even2; | ||||
|         } | ||||
|         if (this.mRawShadowSize == even && this.mRawMaxShadowSize == even2) { | ||||
|             return; | ||||
|         } | ||||
|         this.mRawShadowSize = even; | ||||
|         this.mRawMaxShadowSize = even2; | ||||
|         this.mShadowSize = (int) ((even * SHADOW_MULTIPLIER) + this.mInsetShadow + 0.5f); | ||||
|         this.mDirty = true; | ||||
|         invalidateSelf(); | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     public boolean getPadding(Rect rect) { | ||||
|         int ceil = (int) Math.ceil(calculateVerticalPadding(this.mRawMaxShadowSize, this.mCornerRadius, this.mAddPaddingForCorners)); | ||||
|         int ceil2 = (int) Math.ceil(calculateHorizontalPadding(this.mRawMaxShadowSize, this.mCornerRadius, this.mAddPaddingForCorners)); | ||||
|         rect.set(ceil2, ceil, ceil2, ceil); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     protected boolean onStateChange(int[] iArr) { | ||||
|         ColorStateList colorStateList = this.mBackground; | ||||
|         int colorForState = colorStateList.getColorForState(iArr, colorStateList.getDefaultColor()); | ||||
|         if (this.mPaint.getColor() == colorForState) { | ||||
|             return false; | ||||
|         } | ||||
|         this.mPaint.setColor(colorForState); | ||||
|         this.mDirty = true; | ||||
|         invalidateSelf(); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     public boolean isStateful() { | ||||
|         ColorStateList colorStateList = this.mBackground; | ||||
|         return (colorStateList != null && colorStateList.isStateful()) || super.isStateful(); | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     public void setColorFilter(ColorFilter colorFilter) { | ||||
|         this.mPaint.setColorFilter(colorFilter); | ||||
|     } | ||||
|  | ||||
|     void setCornerRadius(float f) { | ||||
|         if (f < 0.0f) { | ||||
|             throw new IllegalArgumentException("Invalid radius " + f + ". Must be >= 0"); | ||||
|         } | ||||
|         float f2 = (int) (f + 0.5f); | ||||
|         if (this.mCornerRadius == f2) { | ||||
|             return; | ||||
|         } | ||||
|         this.mCornerRadius = f2; | ||||
|         this.mDirty = true; | ||||
|         invalidateSelf(); | ||||
|     } | ||||
|  | ||||
|     @Override // android.graphics.drawable.Drawable | ||||
|     public void draw(Canvas canvas) { | ||||
|         if (this.mDirty) { | ||||
|             buildComponents(getBounds()); | ||||
|             this.mDirty = false; | ||||
|         } | ||||
|         canvas.translate(0.0f, this.mRawShadowSize / 2.0f); | ||||
|         drawShadow(canvas); | ||||
|         canvas.translate(0.0f, (-this.mRawShadowSize) / 2.0f); | ||||
|         sRoundRectHelper.drawRoundRect(canvas, this.mCardBounds, this.mCornerRadius, this.mPaint); | ||||
|     } | ||||
|  | ||||
|     private void drawShadow(Canvas canvas) { | ||||
|         float f = this.mCornerRadius; | ||||
|         float f2 = (-f) - this.mShadowSize; | ||||
|         float f3 = f + this.mInsetShadow + (this.mRawShadowSize / 2.0f); | ||||
|         float f4 = f3 * 2.0f; | ||||
|         boolean z = this.mCardBounds.width() - f4 > 0.0f; | ||||
|         boolean z2 = this.mCardBounds.height() - f4 > 0.0f; | ||||
|         int save = canvas.save(); | ||||
|         canvas.translate(this.mCardBounds.left + f3, this.mCardBounds.top + f3); | ||||
|         canvas.drawPath(this.mCornerShadowPath, this.mCornerShadowPaint); | ||||
|         if (z) { | ||||
|             canvas.drawRect(0.0f, f2, this.mCardBounds.width() - f4, -this.mCornerRadius, this.mEdgeShadowPaint); | ||||
|         } | ||||
|         canvas.restoreToCount(save); | ||||
|         int save2 = canvas.save(); | ||||
|         canvas.translate(this.mCardBounds.right - f3, this.mCardBounds.bottom - f3); | ||||
|         canvas.rotate(180.0f); | ||||
|         canvas.drawPath(this.mCornerShadowPath, this.mCornerShadowPaint); | ||||
|         if (z) { | ||||
|             canvas.drawRect(0.0f, f2, this.mCardBounds.width() - f4, (-this.mCornerRadius) + this.mShadowSize, this.mEdgeShadowPaint); | ||||
|         } | ||||
|         canvas.restoreToCount(save2); | ||||
|         int save3 = canvas.save(); | ||||
|         canvas.translate(this.mCardBounds.left + f3, this.mCardBounds.bottom - f3); | ||||
|         canvas.rotate(270.0f); | ||||
|         canvas.drawPath(this.mCornerShadowPath, this.mCornerShadowPaint); | ||||
|         if (z2) { | ||||
|             canvas.drawRect(0.0f, f2, this.mCardBounds.height() - f4, -this.mCornerRadius, this.mEdgeShadowPaint); | ||||
|         } | ||||
|         canvas.restoreToCount(save3); | ||||
|         int save4 = canvas.save(); | ||||
|         canvas.translate(this.mCardBounds.right - f3, this.mCardBounds.top + f3); | ||||
|         canvas.rotate(90.0f); | ||||
|         canvas.drawPath(this.mCornerShadowPath, this.mCornerShadowPaint); | ||||
|         if (z2) { | ||||
|             canvas.drawRect(0.0f, f2, this.mCardBounds.height() - f4, -this.mCornerRadius, this.mEdgeShadowPaint); | ||||
|         } | ||||
|         canvas.restoreToCount(save4); | ||||
|     } | ||||
|  | ||||
|     private void buildShadowCorners() { | ||||
|         float f = this.mCornerRadius; | ||||
|         RectF rectF = new RectF(-f, -f, f, f); | ||||
|         RectF rectF2 = new RectF(rectF); | ||||
|         float f2 = this.mShadowSize; | ||||
|         rectF2.inset(-f2, -f2); | ||||
|         Path path = this.mCornerShadowPath; | ||||
|         if (path == null) { | ||||
|             this.mCornerShadowPath = new Path(); | ||||
|         } else { | ||||
|             path.reset(); | ||||
|         } | ||||
|         this.mCornerShadowPath.setFillType(Path.FillType.EVEN_ODD); | ||||
|         this.mCornerShadowPath.moveTo(-this.mCornerRadius, 0.0f); | ||||
|         this.mCornerShadowPath.rLineTo(-this.mShadowSize, 0.0f); | ||||
|         this.mCornerShadowPath.arcTo(rectF2, 180.0f, 90.0f, false); | ||||
|         this.mCornerShadowPath.arcTo(rectF, 270.0f, -90.0f, false); | ||||
|         this.mCornerShadowPath.close(); | ||||
|         float f3 = this.mCornerRadius; | ||||
|         float f4 = f3 / (this.mShadowSize + f3); | ||||
|         Paint paint = this.mCornerShadowPaint; | ||||
|         float f5 = this.mCornerRadius + this.mShadowSize; | ||||
|         int i = this.mShadowStartColor; | ||||
|         paint.setShader(new RadialGradient(0.0f, 0.0f, f5, new int[]{i, i, this.mShadowEndColor}, new float[]{0.0f, f4, 1.0f}, Shader.TileMode.CLAMP)); | ||||
|         Paint paint2 = this.mEdgeShadowPaint; | ||||
|         float f6 = this.mCornerRadius; | ||||
|         float f7 = this.mShadowSize; | ||||
|         float f8 = (-f6) + f7; | ||||
|         float f9 = (-f6) - f7; | ||||
|         int i2 = this.mShadowStartColor; | ||||
|         paint2.setShader(new LinearGradient(0.0f, f8, 0.0f, f9, new int[]{i2, i2, this.mShadowEndColor}, new float[]{0.0f, 0.5f, 1.0f}, Shader.TileMode.CLAMP)); | ||||
|         this.mEdgeShadowPaint.setAntiAlias(false); | ||||
|     } | ||||
|  | ||||
|     private void buildComponents(Rect rect) { | ||||
|         float f = this.mRawMaxShadowSize * SHADOW_MULTIPLIER; | ||||
|         this.mCardBounds.set(rect.left + this.mRawMaxShadowSize, rect.top + f, rect.right - this.mRawMaxShadowSize, rect.bottom - f); | ||||
|         buildShadowCorners(); | ||||
|     } | ||||
|  | ||||
|     void getMaxShadowAndCornerPadding(Rect rect) { | ||||
|         getPadding(rect); | ||||
|     } | ||||
|  | ||||
|     void setShadowSize(float f) { | ||||
|         setShadowSize(f, this.mRawMaxShadowSize); | ||||
|     } | ||||
|  | ||||
|     void setMaxShadowSize(float f) { | ||||
|         setShadowSize(this.mRawShadowSize, f); | ||||
|     } | ||||
|  | ||||
|     float getMinWidth() { | ||||
|         float f = this.mRawMaxShadowSize; | ||||
|         return (Math.max(f, this.mCornerRadius + this.mInsetShadow + (f / 2.0f)) * 2.0f) + ((this.mRawMaxShadowSize + this.mInsetShadow) * 2.0f); | ||||
|     } | ||||
|  | ||||
|     float getMinHeight() { | ||||
|         float f = this.mRawMaxShadowSize; | ||||
|         return (Math.max(f, this.mCornerRadius + this.mInsetShadow + ((f * SHADOW_MULTIPLIER) / 2.0f)) * 2.0f) + (((this.mRawMaxShadowSize * SHADOW_MULTIPLIER) + this.mInsetShadow) * 2.0f); | ||||
|     } | ||||
|  | ||||
|     void setColor(ColorStateList colorStateList) { | ||||
|         setBackground(colorStateList); | ||||
|         invalidateSelf(); | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user