通过PorterDuffXfermode设置圆角/圆形图片:
效果图:
/**
* 圆或圆角图片
* @param bitmap
* @param drawcircle 是否绘制圆
* @return
*/
public Bitmap toRoundBitmap(Bitmap bitmap,boolean drawcircle) {
int width = bitmap.getWidth();// 获取图片的宽度
int height = bitmap.getHeight();// 获取图片的高度
int squareWidth = Math.min(width, height);
// 正方形的边长,以宽和高中最小的那个为参照,截取正方形
Bitmap backgroundBmp = Bitmap.createBitmap(squareWidth,squareWidth,Config.ARGB_8888);// 构建一个正方形的bitmap
// 创建一个画布,用于画图
Canvas canvas = new Canvas(backgroundBmp);
// 创建一个画笔
Paint paint = new Paint();
paint.setAntiAlias(true); // 设置边缘光滑,去掉锯齿
//取正中间的部分、正方形的左上右下坐标
Rect src = new Rect(width/2-squareWidth/2,height/2-squareWidth/2, width/2+squareWidth/2, height/2+squareWidth/2);
//目标图片的大小
RectF dest = new RectF(0,0, squareWidth, squareWidth);
if(drawcircle){
canvas.drawCircle(squareWidth/2, squareWidth/2, squareWidth/2, paint);//画一个圆
}else{
canvas.drawRoundRect(dest, 100,100, paint); //画圆角
}
// 设置当两个图形相交时的模式,SRC_IN为取图形相交的部分,多余的将被去掉
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, src, dest, paint); // canvas将bitmap画在backgroundBmp上
return backgroundBmp; // 返回已经绘画好的backgroundBmp
}
PorterDuffXfermode:
效果图(来自ApiDemos/Graphics/XferModes)
PorterDuff.Mode为枚举类,一共有16个枚举值:
1.PorterDuff.Mode.CLEAR
所绘制不会提交到画布上。2.PorterDuff.Mode.SRC
显示上层绘制图片3.PorterDuff.Mode.DST
显示下层绘制图片4.PorterDuff.Mode.SRC_OVER
正常绘制显示,上下层绘制叠盖。5.PorterDuff.Mode.DST_OVER
上下层都显示。下层居上显示。6.PorterDuff.Mode.SRC_IN
取两层绘制交集。显示上层。7.PorterDuff.Mode.DST_IN
取两层绘制交集。显示下层。8.PorterDuff.Mode.SRC_OUT
取上层绘制非交集部分。9.PorterDuff.Mode.DST_OUT
取下层绘制非交集部分。10.PorterDuff.Mode.SRC_ATOP
取下层非交集部分与上层交集部分11.PorterDuff.Mode.DST_ATOP
取上层非交集部分与下层交集部分12.PorterDuff.Mode.XOR
异或:去除两图层交集部分13.PorterDuff.Mode.DARKEN
取两图层全部区域,交集部分颜色加深14.PorterDuff.Mode.LIGHTEN
取两图层全部,点亮交集部分颜色15.PorterDuff.Mode.MULTIPLY
取两图层交集部分叠加后颜色16.PorterDuff.Mode.SCREEN
取两图层全部区域,交集部分变为透明色