最近在看OpenCamera的源码,表示受益很深,项目地址:https://github.com/almalence/OpenCamera
画一个圆角的图,使用PorterDuff.Mode的属性,话不多说,直接上代码
/**
* 方形圆角图片
*
* @param bitmap 图片
* @param size 要显示的大小,如果需要截图从中心截图
* @param borderRadius 圆角弧度 到一定值就为圆了
* @param color 图片边缘颜色
* @param borderWidth 图片边缘宽度
* @return
*/
private Bitmap getRoundedCornerBitmap(Bitmap bitmap, int size, int borderRadius, @ColorInt int color, int borderWidth) {
final int side = Math.min(bitmap.getWidth(), bitmap.getHeight());
final Bitmap bitmapCropped = Bitmap.createBitmap(bitmap, (bitmap.getWidth() - side) / 2,
(bitmap.getHeight() - side) / 2, side, side);
final Bitmap output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final Rect rectSrc = new Rect(0, 0, bitmapCropped.getWidth(), bitmapCropped.getHeight());
final Rect rect = new Rect(borderWidth, borderWidth, output.getWidth() - borderWidth, output.getHeight() - borderWidth);
final RectF rectF = new RectF(rect);
final RectF rectFBorder = new RectF(0, 0, output.getWidth(), output.getHeight());
final float roundPx = borderRadius;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//取两层绘制交集,显示上层
// 第一个Rect 代表要绘制的bitmap 区域,第二个 Rect 代表的是要将bitmap 绘制在屏幕的什么地方
canvas.drawBitmap(bitmapCropped, rectSrc, rect, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP));//取下层非交集部分与上层交集部分
canvas.drawRoundRect(rectFBorder, roundPx, roundPx, paint);
return output;
}