圆角图片

236 阅读1分钟

import android.graphics.Bitmap;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.PorterDuff;

import android.graphics.PorterDuffXfermode;

import android.graphics.Rect;

import android.graphics.RectF;

  

public class BitmapFillet {

  

    public static final int CORNER_NONE = 0;

    public static final int CORNER_TOP_LEFT = 1;

    public static final int CORNER_TOP_RIGHT = 1 << 1;

    public static final int CORNER_BOTTOM_LEFT = 1 << 2;

    public static final int CORNER_BOTTOM_RIGHT = 1 << 3;

    public static final int CORNER_ALL = CORNER_TOP_LEFT | CORNER_TOP_RIGHT | CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;

    public static final int CORNER_TOP = CORNER_TOP_LEFT | CORNER_TOP_RIGHT;

    public static final int CORNER_BOTTOM = CORNER_BOTTOM_LEFT | CORNER_BOTTOM_RIGHT;

    public static final int CORNER_LEFT = CORNER_TOP_LEFT | CORNER_BOTTOM_LEFT;

    public static final int CORNER_RIGHT = CORNER_TOP_RIGHT | CORNER_BOTTOM_RIGHT;

  

    public static Bitmap fillet(Bitmap bitmap, int roundPx,int corners) {

        try {

            // 其原理就是:先建立一个与图片大小相同的透明的Bitmap画板  

            // 然后在画板上画出一个想要的形状的区域。  

            // 最后把源图片帖上。  

            final int width = bitmap.getWidth();

            final int height = bitmap.getHeight();

  

            Bitmap paintingBoard = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);  

            Canvas canvas = new Canvas(paintingBoard);

            canvas.drawARGB(Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT, Color.TRANSPARENT);  

  

            final Paint paint = new Paint();

            paint.setAntiAlias(true);

            paint.setColor(Color.BLACK);  

  

            //画出4个圆角  

            final RectF rectF = new RectF(0, 0, width, height);

            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);  

  

            //把不需要的圆角去掉  

            int notRoundedCorners = corners ^ CORNER_ALL;

            if ((notRoundedCorners & CORNER_TOP_LEFT) != 0) {

                clipTopLeft(canvas,paint,roundPx,width,height);  

            }  

            if ((notRoundedCorners & CORNER_TOP_RIGHT) != 0) {

                clipTopRight(canvas, paint, roundPx, width, height);  

            }  

            if ((notRoundedCorners & CORNER_BOTTOM_LEFT) != 0) {

                clipBottomLeft(canvas,paint,roundPx,width,height);  

            }  

            if ((notRoundedCorners & CORNER_BOTTOM_RIGHT) != 0) {

                clipBottomRight(canvas, paint, roundPx, width, height);  

            }  

            paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));

  

            //帖子图  

            final Rect src = new Rect(0, 0, width, height);

            final Rect dst = src;

            canvas.drawBitmap(bitmap, src, dst, paint);  

            return paintingBoard;

        } catch (Exception exp) {

            return bitmap;

        }  

    }  

  

    private static void clipTopLeft(final Canvas canvas, final Paint paint, int offset, int width, int height) {

        final Rect block = new Rect(0, 0, offset, offset);

        canvas.drawRect(block, paint);  

    }  

  

    private static void clipTopRight(final Canvas canvas, final Paint paint, int offset, int width, int height) {

        final Rect block = new Rect(width - offset, 0, width, offset);

        canvas.drawRect(block, paint);  

    }  

  

    private static void clipBottomLeft(final Canvas canvas, final Paint paint, int offset, int width, int height) {

        final Rect block = new Rect(0, height - offset, offset, height);

        canvas.drawRect(block, paint);  

    }  

  

    private static void clipBottomRight(final Canvas canvas, final Paint paint, int offset, int width, int height) {

        final Rect block = new Rect(width - offset, height - offset, width, height);

        canvas.drawRect(block, paint);  

    }  

}