Android Xfermode 實戰 實現圓形、圓角圖片

發表於2015-05-21

1、概述

其實這篇本來準備Android BitmapShader 實戰 實現圓形、圓角圖片放到一篇裡面,結果由於篇幅原因就獨立出來了~在很久以前也寫過一個利用Xfermode 實現圓形、圓角圖片的,但是那個繼承的是View,其實繼承ImageView能方便點,最起碼省去了onMeasure裡面自己去策略,以及不需要自己去提供設定圖片的方法,最主要的是大家對ImageView的API會比較熟悉,用起來會比較順手。

好了,本篇就當是個記錄了~~~電腦上程式碼放幾天就找不到了,還是放部落格裡面,有需要自己過來看看~~~

2、原理

原理就不多說了,這張圖在我部落格裡出現的次數大概有3次以上了,我們這次使用的模式DST_IN;也就是先繪製圖片,再繪製形狀了~~

3、Xfermode實戰

1、自定義屬性

首先依然是自定義屬性,和上篇一致。

2、構造中獲取屬性

獲取自定義屬性,然後還寫些成員變數~~

3、onMeasure

在onMeasure中,如果是圓形則重新設定view大小。

4、onDraw

在onDraw中拿到drawable,然後獲取drawable的寬和高,根據當前的type和view的寬和高,進行適當的縮放。具體原理:參考上篇的matrix的scale計算,原理一致。

然後就是設定Xfermode,getBitmap會根據type返回圖形,直接繪製到記憶體中的bitmap上即可。最後把bitmap快取起來,避免每次onDraw都分配記憶體和重啟繪圖。

大家可以進行擴充套件type,繪製心形、三角形什麼的,直接在getBitmap裡面新增分支就可以。

最後記得invalidate中做一些處理:

主要是因為我們快取了,當呼叫invalidate時,將快取清除。

4、佈局檔案及效果圖

效果圖:

好了,比較簡單~~

宣告下:本例參考了:https://github.com/MostafaGazar/CustomShapeImageView ;不過對其中的部分程式碼進行了改變,比如CustomShapeImageView如果圖片為長方形,但是設定為circle型別,效果依然是矩形;以及會對bitmap比例和view比例不一致的直接進行壓縮,類似fitxy的效果~~~主要對這兩點進行了修改~~當然了,該案例比本部落格功能要強大,看名字也知道,支援很多形狀,以及支援SVG~大家自行進行參考~

原始碼點選下載

相關文章