summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--graphics/java/android/graphics/drawable/RevealDrawable.java21
-rw-r--r--graphics/java/android/graphics/drawable/Ripple.java48
2 files changed, 41 insertions, 28 deletions
diff --git a/graphics/java/android/graphics/drawable/RevealDrawable.java b/graphics/java/android/graphics/drawable/RevealDrawable.java
index c357ae1487a2..38765e8f7cc9 100644
--- a/graphics/java/android/graphics/drawable/RevealDrawable.java
+++ b/graphics/java/android/graphics/drawable/RevealDrawable.java
@@ -18,6 +18,7 @@ package android.graphics.drawable;
import android.content.res.Resources;
import android.graphics.Canvas;
+import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
@@ -248,6 +249,7 @@ public class RevealDrawable extends LayerDrawable {
}
// Draw ripple mask into a buffer that merges using SRC_OVER.
+ boolean needsMask = false;
int layerSaveCount = -1;
int n = activeRipples.size();
for (int i = 0; i < n; i++) {
@@ -261,7 +263,7 @@ public class RevealDrawable extends LayerDrawable {
layerSaveCount = canvas.saveLayer(0, 0, width, height, null, 0);
}
- ripple.draw(canvas, mRipplePaint);
+ needsMask |= ripple.draw(canvas, mRipplePaint);
}
}
@@ -269,15 +271,18 @@ public class RevealDrawable extends LayerDrawable {
// into another layer and composite using SRC_IN, then composite onto
// the original canvas.
if (layerSaveCount >= 0) {
- if (mMaskingPaint == null) {
- mMaskingPaint = new Paint();
- mMaskingPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
+ if (needsMask) {
+ if (mMaskingPaint == null) {
+ mMaskingPaint = new Paint();
+ mMaskingPaint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
+ }
+
+ // TODO: When Drawable.setXfermode() is supported by all drawables,
+ // we won't need an extra layer.
+ canvas.saveLayer(0, 0, width, height, mMaskingPaint, 0);
+ getDrawable(1).draw(canvas);
}
- // TODO: When Drawable.setXfermode() is supported by all drawables,
- // we won't need an extra layer.
- canvas.saveLayer(0, 0, width, height, mMaskingPaint, 0);
- getDrawable(1).draw(canvas);
canvas.restoreToCount(layerSaveCount);
}
}
diff --git a/graphics/java/android/graphics/drawable/Ripple.java b/graphics/java/android/graphics/drawable/Ripple.java
index 6378cb73a9c7..543d2a6493ea 100644
--- a/graphics/java/android/graphics/drawable/Ripple.java
+++ b/graphics/java/android/graphics/drawable/Ripple.java
@@ -160,7 +160,7 @@ class Ripple {
}
}
- public void draw(Canvas c, Paint p) {
+ public boolean draw(Canvas c, Paint p) {
final Rect bounds = mBounds;
final Rect padding = mPadding;
final float dX = Math.max(mX, bounds.right - mX);
@@ -221,26 +221,34 @@ class Ripple {
}
}
- if (exitState <= 0) {
- // Exit state isn't showing, so we can simplify to a solid
- // circle.
- if (outerRadius > 0) {
- p.setAlpha(maxAlpha);
- p.setStyle(Style.FILL);
- c.drawCircle(x, y, outerRadius, p);
- }
- } else {
- // Both states are showing, so we need a circular stroke.
- final float innerRadius = MathUtils.lerp(0, outerRadius, exitState);
- final float strokeWidth = outerRadius - innerRadius;
- if (strokeWidth > 0) {
- final float strokeRadius = innerRadius + strokeWidth / 2f;
- final int alpha = (int) (MathUtils.lerp(maxAlpha, 0, exitState) + 0.5f);
- p.setAlpha(alpha);
- p.setStyle(Style.STROKE);
- p.setStrokeWidth(strokeWidth);
- c.drawCircle(x, y, strokeRadius, p);
+ if (maxAlpha > 0) {
+ if (exitState <= 0) {
+ // Exit state isn't showing, so we can simplify to a solid
+ // circle.
+ if (outerRadius > 0) {
+ p.setAlpha(maxAlpha);
+ p.setStyle(Style.FILL);
+ c.drawCircle(x, y, outerRadius, p);
+ return true;
+ }
+ } else {
+ // Both states are showing, so we need a circular stroke.
+ final float innerRadius = MathUtils.lerp(0, outerRadius, exitState);
+ final float strokeWidth = outerRadius - innerRadius;
+ if (strokeWidth > 0) {
+ final float strokeRadius = innerRadius + strokeWidth / 2f;
+ final int alpha = (int) (MathUtils.lerp(maxAlpha, 0, exitState) + 0.5f);
+ if (alpha > 0) {
+ p.setAlpha(alpha);
+ p.setStyle(Style.STROKE);
+ p.setStrokeWidth(strokeWidth);
+ c.drawCircle(x, y, strokeRadius, p);
+ return true;
+ }
+ }
}
}
+
+ return false;
}
}