cesards
2/22/2015 - 2:53 AM

PartialRoundedTransformation

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;

import com.squareup.picasso.Transformation;

import java.util.Arrays;

/**
 * Transformation for rounded corners
 *
 * @author Saul Diaz <sefford@gmail.com>
 */
public class PartialRoundedBorderTransformation implements Transformation {

    /**
     * Pixels to round by corner
     */
    private final float pixels;
    /**
     * Edges to round rect being 0 - left, 1 - top, 2 - right, 3 - bottom
     */
    private final boolean[] edges;

    /**
     * Creates a new instance of RoundedBorderTransformation
     *
     * @param pixels Pixels to round by corner
     * @param edges Edges to trim from the picture
     */
    public PartialRoundedBorderTransformation(float pixels, boolean[] edges) {
        this.pixels = pixels;
        this.edges = Arrays.copyOf(edges, edges.length);
    }

    @Override
    public Bitmap transform(Bitmap source) {
        Bitmap output = Bitmap.createBitmap(source.getWidth(), source
                .getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        final int color = 0xff424242;
        final Paint paint = new Paint();
        final Rect rect = new Rect(0, 0, source.getWidth(), source.getHeight());
        final RectF rectF = new RectF(rect);
        final float roundPx = pixels;

        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
        if (edges[0]) {
            canvas.drawRect(new RectF(0, 0, pixels, source.getHeight()), paint);
        }
        if (edges[1]) {
            canvas.drawRect(new RectF(0, 0, source.getWidth(), pixels), paint);
        }
        if (edges[2]) {
            canvas.drawRect(new RectF(source.getWidth() - pixels, 0, source.getWidth(), source.getHeight()), paint);
        }
        if (edges[3]) {
            canvas.drawRect(new RectF(0, source.getHeight() - pixels, source.getWidth(), source.getHeight()), paint);
        }
        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(source, rect, rect, paint);
        source.recycle();
        return output;
    }

    @Override
    public String key() {
        return "rounded_"+this.edges+"_"+this.pixels;
    }
}