現(xiàn)在大部分的項目都會使用圓角圖片,所以這算是個很常見的需求.相對于IOS只需要簡單的設置個屬性就行了,Android上要實現(xiàn)類似的功能,稍微有點麻煩.因為機智的蘋果將圓角圖片申請了專利,所以你懂的. 貌似蘋果正在申請雙卡雙待的專利?
Android上實現(xiàn)圓角圖片的方式應該有不少,就我所知,有以下幾種思路:
Canvas 裁剪,這種方式應該是最簡單暴力的.Canvas提供了一系列 clipxxx的方法(忘記名字了...),可以將畫板裁剪成你想要的形狀,通過這種方式的消耗應該也是最小的. 但是 貌似裁剪后的鋸齒問題無法解決,所以這里就不細說了.
-
Drawalbe層面的轉(zhuǎn)換,使用某種方法將原來的drawable轉(zhuǎn)換為圓角(圓形),然后設置到ImageView上. 系統(tǒng)為我們提供了封裝好的API用于生成圓角圖片.RoundedBitmapDrawableFactory, 使用方式如下:
RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap); //生成圓形drawalbe //roundedBitmapDrawable.setCircular(true); //設置圓角大小 roundedBitmapDrawable.setCornerRadius(mBorderRadius);
使用BitmapShader 實現(xiàn). 關(guān)于 BitmapShader 我簡單的理解就是將 drawalbe 轉(zhuǎn)換為 bitmap,然后在初始化 BitmapShader 的時候?qū)?bitmap傳入, 接著將 BitmapShader 對象設置給 畫筆, 最后你拿著畫筆去畫出想要的形狀就可以了. 可能表達能力不是很好,不過因為不是本文的重點,這里就不展開了.感興趣的推薦看一下大神的文章: http://blog.csdn.net/lmj623565791/article/details/41967509
通過 Xfermode 實現(xiàn).國外有大神稱之為過渡模式,不過我更喜歡稱為圖像混合模式..它有3個子類 AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,前兩個都已經(jīng)過時,我們將使用PorterDuffXfermode來實現(xiàn)我們的需求. PorterDuffXfermode 通過構(gòu)造方式創(chuàng)建,接受一個參數(shù) PorterDuff.Mode 關(guān)于PorterDuff.Mode,我相信下面這張圖可以有助于理解.

簡單的說,就是有兩張圖片,一張叫Dst(目標圖片),一張叫Src(源圖). 將Src放在Dst上面時,通過不同的模式,得到的結(jié)果也各不相同 .比如將要用到的 SrcIn 模式,就是 **只繪制Src和Dst相交部分的Src. **按照這種思路,假設我先在ImageView上畫一個圓形,加上我原來的圖片,是否就能得到我想要的圓形圖片了呢?
所以需要重寫ImageView的onDraw方法,代碼實現(xiàn)如下:
//保存圖層
int save = canvas.saveLayer(0,0,w,h,null,Canvas.ALL_SAVE_FLAG);
//繪制圓形
canvas.drawCircle(w/2,h/2, w > h ? h/2 : w/2,paint);
//繪制圓角矩形
//canvas.drawRoundRect(rectF,mBorderRadius,mBorderRadius,paint);
// 設置混合模式為 src_in
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.saveLayer(0, 0, w,h, paint, Canvas.ALL_SAVE_FLAG);
// 繪制原圖片
getDrawable().draw(canvas);
// 恢復Layer
canvas.restoreToCount(save);
paint.setXfermode(null);
效果如下(手機截屏有點大):
