From 3047cb298d05ef8c61ab2bc7f63e32ca936232a6 Mon Sep 17 00:00:00 2001 From: Jay Aliomer Date: Thu, 8 Apr 2021 12:33:50 -0400 Subject: [PATCH] Ripple radius bug Fixes: b/183912412 Test: manual test Change-Id: I9bf3a32f2f983eb6d837e1e51d6feb1845564d22 --- .../android/graphics/drawable/RippleDrawable.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/graphics/java/android/graphics/drawable/RippleDrawable.java b/graphics/java/android/graphics/drawable/RippleDrawable.java index 8b8cbbc8a9a63..0865332636342 100644 --- a/graphics/java/android/graphics/drawable/RippleDrawable.java +++ b/graphics/java/android/graphics/drawable/RippleDrawable.java @@ -180,6 +180,7 @@ public class RippleDrawable extends LayerDrawable { private Matrix mMaskMatrix; private PorterDuffColorFilter mMaskColorFilter; private boolean mHasValidMask; + private int mComputedRadius = -1; /** The current ripple. May be actively animating or pending entry. */ private RippleForeground mRipple; @@ -385,9 +386,7 @@ public class RippleDrawable extends LayerDrawable { mRipple.onBoundsChange(); } - mState.mMaxRadius = mState.mMaxRadius <= 0 && mState.mRippleStyle != STYLE_SOLID - ? (int) computeRadius() - : mState.mMaxRadius; + mComputedRadius = Math.round(computeRadius()); invalidateSelf(); } @@ -918,7 +917,7 @@ public class RippleDrawable extends LayerDrawable { ColorFilter origFilter = p.getColorFilter(); p.setColorFilter(mMaskColorFilter); p.setAlpha(alpha); - c.drawCircle(cx, cy, mState.mMaxRadius, p); + c.drawCircle(cx, cy, getComputedRadius(), p); p.setAlpha(origAlpha); p.setColorFilter(origFilter); } @@ -930,11 +929,17 @@ public class RippleDrawable extends LayerDrawable { return radius; } + private int getComputedRadius() { + if (mState.mMaxRadius >= 0) return mState.mMaxRadius; + if (mComputedRadius >= 0) return mComputedRadius; + return (int) computeRadius(); + } + @NonNull private RippleAnimationSession.AnimationProperties createAnimationProperties( float x, float y, float cx, float cy, float w, float h) { Paint p = new Paint(mRipplePaint); - float radius = mState.mMaxRadius; + float radius = getComputedRadius(); RippleAnimationSession.AnimationProperties properties; RippleShader shader = new RippleShader(); int color = mMaskColorFilter == null