diff --git a/transformations/src/main/java/jp/wasabeef/glide/transformations/RoundedCornersTransformation.java b/transformations/src/main/java/jp/wasabeef/glide/transformations/RoundedCornersTransformation.java index d55dd40..f0efedf 100644 --- a/transformations/src/main/java/jp/wasabeef/glide/transformations/RoundedCornersTransformation.java +++ b/transformations/src/main/java/jp/wasabeef/glide/transformations/RoundedCornersTransformation.java @@ -31,19 +31,30 @@ import com.bumptech.glide.load.resource.bitmap.BitmapResource; public class RoundedCornersTransformation implements Transformation { - private BitmapPool mBitmapPool; - - private int radius; - private int margin; - - public RoundedCornersTransformation(Context context, int radius, int margin) { - this(Glide.get(context).getBitmapPool(), radius, margin); + public enum CornerType { + ALL, + TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT, + TOP, BOTTOM, LEFT, RIGHT, + OTHER_TOP_LEFT, OTHER_TOP_RIGHT, OTHER_BOTTOM_LEFT, OTHER_BOTTOM_RIGHT, + DIAGONAL_FROM_TOP_LEFT, DIAGONAL_FROM_TOP_RIGHT } - public RoundedCornersTransformation(BitmapPool pool, int radius, int margin) { - mBitmapPool = pool; - this.radius = radius; - this.margin = margin; + private BitmapPool mBitmapPool; + private int mRadius; + private int mDiameter; + private int mMargin; + private CornerType mCornerType; + + public RoundedCornersTransformation(Context context, int radius, int margin) { + this(context, radius, margin, CornerType.ALL); + } + + public RoundedCornersTransformation(Context context, int radius, int margin, CornerType cornerType) { + mBitmapPool = Glide.get(context).getBitmapPool(); + mRadius = radius; + mDiameter = mRadius * 2; + mMargin = margin; + mCornerType = cornerType; } @Override @@ -62,13 +73,150 @@ public class RoundedCornersTransformation implements Transformation { Paint paint = new Paint(); paint.setAntiAlias(true); paint.setShader(new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)); - canvas.drawRoundRect(new RectF(margin, margin, width - margin, height - margin), radius, radius, - paint); - + drawRoundRect(canvas, paint, width, height); return BitmapResource.obtain(bitmap, mBitmapPool); } - @Override public String getId() { - return "RoundedTransformation(radius=" + radius + ", margin=" + margin + ")"; + private void drawRoundRect(Canvas canvas, Paint paint, float width, float height) { + float right = width - mMargin; + float bottom = height - mMargin; + + switch (mCornerType) { + case ALL: + canvas.drawRoundRect(new RectF(mMargin, mMargin, right, bottom), mRadius, mRadius, paint); + break; + case TOP_LEFT: + drawTopLeftRoundRect(canvas, paint, right, bottom); + break; + case TOP_RIGHT: + drawTopRightRoundRect(canvas, paint, right, bottom); + break; + case BOTTOM_LEFT: + drawBottomLeftRoundRect(canvas, paint, right, bottom); + break; + case BOTTOM_RIGHT: + drawBottomRightRoundRect(canvas, paint, right, bottom); + break; + case TOP: + drawTopRoundRect(canvas, paint, right, bottom); + break; + case BOTTOM: + drawBottomRoundRect(canvas, paint, right, bottom); + break; + case LEFT: + drawLeftRoundRect(canvas, paint, right, bottom); + break; + case RIGHT: + drawRightRoundRect(canvas, paint, right, bottom); + break; + case OTHER_TOP_LEFT: + drawOtherTopLeftRoundRect(canvas, paint, right, bottom); + break; + case OTHER_TOP_RIGHT: + drawOtherTopRightRoundRect(canvas, paint, right, bottom); + break; + case OTHER_BOTTOM_LEFT: + drawOtherBottomLeftRoundRect(canvas, paint, right, bottom); + break; + case OTHER_BOTTOM_RIGHT: + drawOtherBottomRightRoundRect(canvas, paint, right, bottom); + break; + case DIAGONAL_FROM_TOP_LEFT: + drawDiagonalFromTopLeftRoundRect(canvas, paint, right, bottom); + break; + case DIAGONAL_FROM_TOP_RIGHT: + drawDiagonalFromTopRightRoundRect(canvas, paint, right, bottom); + break; + default: + canvas.drawRoundRect(new RectF(mMargin, mMargin, right, bottom), mRadius, mRadius, paint); + break; + } + } + + private void drawTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin + mRadius, mMargin + mRadius, bottom), paint); + canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint); + } + + private void drawTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint); + canvas.drawRect(new RectF(right - mRadius, mMargin + mRadius, right, bottom), paint); + } + + private void drawBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, mMargin + mDiameter, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom - mRadius), paint); + canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint); + } + + private void drawBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(right - mDiameter, bottom - mDiameter, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint); + canvas.drawRect(new RectF(right - mRadius, mMargin, right, bottom - mRadius), paint); + } + + private void drawTopRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right, bottom), paint); + } + + private void drawBottomRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, right, bottom - mRadius), paint); + } + + private void drawLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom), paint); + } + + private void drawRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom), paint); + } + + private void drawOtherTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius, paint); + canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom - mRadius), paint); + } + + private void drawOtherTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius, paint); + canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin + mRadius, mMargin, right, bottom - mRadius), paint); + } + + private void drawOtherBottomLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right - mRadius, bottom), paint); + } + + private void drawOtherBottomRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, right, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin + mRadius, mMargin + mRadius, right, bottom), paint); + } + + private void drawDiagonalFromTopLeftRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(mMargin, mMargin, mMargin + mDiameter, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRoundRect(new RectF(right - mDiameter, bottom - mDiameter, right, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin + mRadius, right - mDiameter, bottom), paint); + canvas.drawRect(new RectF(mMargin + mDiameter, mMargin, right, bottom - mRadius), paint); + } + + private void drawDiagonalFromTopRightRoundRect(Canvas canvas, Paint paint, float right, float bottom) { + canvas.drawRoundRect(new RectF(right - mDiameter, mMargin, right, mMargin + mDiameter), mRadius, mRadius, paint); + canvas.drawRoundRect(new RectF(mMargin, bottom - mDiameter, mMargin + mDiameter, bottom), mRadius, mRadius, paint); + canvas.drawRect(new RectF(mMargin, mMargin, right - mRadius, bottom - mRadius), paint); + canvas.drawRect(new RectF(mMargin + mRadius, mMargin + mRadius, right, bottom), paint); + } + + @Override + public String getId() { + return "RoundedTransformation(radius=" + mRadius + ", margin=" + mMargin + ")"; } }