圓形,圓角圖片詳解

現(xiàn)在大部分的項目都會使用圓角圖片,所以這算是個很常見的需求.相對于IOS只需要簡單的設置個屬性就行了,Android上要實現(xiàn)類似的功能,稍微有點麻煩.因為機智的蘋果將圓角圖片申請了專利,所以你懂的. 貌似蘋果正在申請雙卡雙待的專利?
Android上實現(xiàn)圓角圖片的方式應該有不少,就我所知,有以下幾種思路:

  1. Canvas 裁剪,這種方式應該是最簡單暴力的.Canvas提供了一系列 clipxxx的方法(忘記名字了...),可以將畫板裁剪成你想要的形狀,通過這種方式的消耗應該也是最小的. 但是 貌似裁剪后的鋸齒問題無法解決,所以這里就不細說了.

  2. Drawalbe層面的轉(zhuǎn)換,使用某種方法將原來的drawable轉(zhuǎn)換為圓角(圓形),然后設置到ImageView上. 系統(tǒng)為我們提供了封裝好的API用于生成圓角圖片.RoundedBitmapDrawableFactory, 使用方式如下:

     RoundedBitmapDrawable roundedBitmapDrawable = RoundedBitmapDrawableFactory.create(getResources(), bitmap);
     //生成圓形drawalbe
     //roundedBitmapDrawable.setCircular(true);
     //設置圓角大小
     roundedBitmapDrawable.setCornerRadius(mBorderRadius);
    

完整代碼

  1. 使用BitmapShader 實現(xiàn). 關(guān)于 BitmapShader 我簡單的理解就是將 drawalbe 轉(zhuǎn)換為 bitmap,然后在初始化 BitmapShader 的時候?qū)?bitmap傳入, 接著將 BitmapShader 對象設置給 畫筆, 最后你拿著畫筆去畫出想要的形狀就可以了. 可能表達能力不是很好,不過因為不是本文的重點,這里就不展開了.感興趣的推薦看一下大神的文章: http://blog.csdn.net/lmj623565791/article/details/41967509

  2. 通過 Xfermode 實現(xiàn).國外有大神稱之為過渡模式,不過我更喜歡稱為圖像混合模式..它有3個子類 AvoidXfermode, PixelXorXfermode和PorterDuffXfermode,前兩個都已經(jīng)過時,我們將使用PorterDuffXfermode來實現(xiàn)我們的需求. PorterDuffXfermode 通過構(gòu)造方式創(chuàng)建,接受一個參數(shù) PorterDuff.Mode 關(guān)于PorterDuff.Mode,我相信下面這張圖可以有助于理解.

212056036741145.jpg

簡單的說,就是有兩張圖片,一張叫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);

效果如下(手機截屏有點大):

S61017-153442.jpg

完整代碼在這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容