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;
}
// 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++) {
layerSaveCount = canvas.saveLayer(0, 0, width, height, null, 0);
}
- ripple.draw(canvas, mRipplePaint);
+ needsMask |= ripple.draw(canvas, mRipplePaint);
}
}
// 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);
}
}
}
}
- 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);
}
}
- 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;
}
}