通過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
取兩圖層全部區域,交集部分變爲透明色