在Android中可以很容通過圖像疊加的規則爲圖片添加圓角效果。正常情況下,在已有的圖像上繪圖時將會在其上面添加一層新的圖形。如果繪圖時使用的Paint是完全不透明的,那麼它將完全遮擋住下面的圖像,如果Paint是部分透明的,那麼它將會對重疊部分圖像的顏色疊加處理。通過PorterDuffXfermode規則可以設置繪製圖像時的疊加規則。PorterDuffXfermode是非常強大的轉換模式,使用它可以設置圖像疊加的Porter-Duff規則,來控制Paint如何與Canvas上已有的圖像進行疊加。下面列舉了常用的12條Porter-Duff規則及其表示的含義:
PorterDuff.Mode.CLEAR 清除畫布上圖像
PorterDuff.Mode.SRC 顯示上層圖像
PorterDuff.Mode.DST 顯示下層圖像
PorterDuff.Mode.SRC_OVER上下層圖像都顯示,下層居上顯示
PorterDuff.Mode.DST_OVER 上下層都顯示,下層居上顯示
PorterDuff.Mode.SRC_IN 取兩層圖像交集部分,只顯示上層圖像
PorterDuff.Mode.DST_IN 取兩層圖像交集部分,只顯示下層圖像
PorterDuff.Mode.SRC_OUT 取上層圖像非交集部分
PorterDuff.Mode.DST_OUT 取下層圖像非交集部分
PorterDuff.Mode.SRC_ATOP 取下層圖像非交集部分與上層圖像交集部分
PorterDuff.Mode.DST_ATOP 取上層圖像非交集部分與下層圖像交集部分
PorterDuff.Mode.XOR 取兩層圖像的非交集部分
下面使用PorterDuff.Mode.SRC_IN規則來給圖片添加圓角效果,主要的思路是先繪製一個圓角矩形,然後在上面繪製圖像,取圖像與圓角矩形的交集部分,只保留圖像。Java代碼如下:
// 圖片圓角處理
public Bitmap getRoundedBitmap() {
Bitmap mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.frame);
// 創建新的位圖
Bitmap bgBitmap =
Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), Config.ARGB_8888);
// 把創建的位圖作爲畫板
Canvas mCanvas = new Canvas(bgBitmap);
Paint mPaint = new Paint();
Rect mRect = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
RectF mRectF = new RectF(mRect);
// 設置圓角半徑爲20
float roundPx = 15;
mPaint.setAntiAlias(true);
// 先繪製圓角矩形
mCanvas.drawRoundRect(mRectF, roundPx, roundPx, mPaint);
// 設置圖像的疊加模式
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
// 繪製圖像
mCanvas.drawBitmap(mBitmap, mRect, mRect, mPaint);
return bgBitmap;
}