情景再現:java
寫Android程序也有一段時間了,今天忽然被問怎麼實現一個圓形圖片,不少app圖像是圓形的。可是用戶上傳的圖像可不是圓的,因此問題就來了,須要咱們代碼實現圓形圖片。可是大腦飛轉想到第三方圖片緩存工具ImageLoader。可是這個只能設置圓角,很難設置實現規則的圓形圖片。而後又想只能經過paint和畫布去畫了,可是隻能畫一個圓,最後怎麼讓這個圓填充上圖片就成問題了。最後沒能回答他的問題。這個時候比較害羞,之前只用過圓角圖片,沒弄過這種圓形圖片啊。因此晚上就查了下資料canvas
實現:緩存
/** * 根據原圖和變長繪製圓形圖片 * * @param source * @param min * @return */ private Bitmap createCircleImage(Bitmap source, int min) { final Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888); /** * 產生一個一樣大小的畫布 */ Canvas canvas = new Canvas(target); /** * 首先繪製圓形 */ canvas.drawCircle(min / 2, min / 2, min / 2, paint); /** * 使用SRC_IN */ paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN)); /** * 繪製圖片 */ canvas.drawBitmap(source, 0, 0, paint); return target; }
其實主要靠:paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));這行代碼,爲何呢,我給你們解釋下,SRC_IN這種模式,兩個繪製的效果疊加後取交集展示後圖,也就是先用paint在畫布中畫一個圓,而後再用圖像去和這個圓疊加。交集後獲得一個圓,而且用圖片填充這個圓。怎麼說呢,我們第一個繪製的是個圓形,第二個繪製的是個Bitmap,因而交集爲圓形,展示的是BItmap,就實現了圓形圖片效果。app