當前位置:編程學習大全網 - 源碼下載 - Android 圓角、圓形 ImageView 實現

Android 圓角、圓形 ImageView 實現

我們要實現的圖片控件繼承自 AppCompatImageView ,它是 ImageView 的子類,但提供了更好的兼容性,我們在此基礎上添加了若幹自定義的屬性和方法以實現最終的 NiceImageView :

要實圓角或者圓形的顯示效果,就是對圖片顯示的內容區域進行“裁剪”,只顯示指定的區域即可。如何做呢?

壹種比較直接的辦法是這樣的,由於圖片是被繪制在畫布上的,所以用 canvas 的 clipPath() 方法先將畫布裁剪成指定形狀,這樣就能讓圖片按指定形狀顯示了,重新 draw() 方法即可:

這樣使用 src 、 background 屬性給ImageView設置顯示的圖片都能達到預期的顯示效果。但是由於 clipPath() 方法不支持抗鋸齒,圖片邊緣會有明顯的毛糙感,體驗並不理想,所以需要尋找其它方法。

另壹種方法是使用圖像的 Alpha 合成模式 ,即

PorterDuff 來實現, 官方文檔 。這裏我們使用其中的 DST_IN 模式。整個過程就是先繪制目標圖像,也就是圖片;再繪制原圖像,即壹個圓角矩形或者圓形,這樣最終目標圖像只顯示和原圖像重合的區域。

到這裏就實現了顯示為圓角或者圓形了。但是需要通過 src 屬性或者對應的方法來設置圖片,否則不能達到預期效果。

繪制邊框就相對容易理解了,只需要繪制壹個指定樣式的圓角矩形或者圓形即可:

當圖片顯示為圓形時,還可以繪制壹個內邊框,但圓角矩形的話由於圓角大小的問題,目前只能設置壹個邊框咯。

但是有個問題,繪制的邊框會覆蓋在圖片上,如果邊框太寬會導致圖片的可見區域變小了,影像顯示效果,像這樣,左下角的花盆不見了:

那麽如何讓邊框不覆蓋在圖片上呢?可以在 Alpha 合成繪制前先將畫布縮小壹定比例,最後再繪制邊框,這樣問題就解決了。

縮放後的ImageView顯示區域的寬高就是原寬、高分別減去2倍的邊框寬度,這樣縮小的比例也就顯而易見了。效果如下,左下角的花盆出來了:

遮罩可以理解為壹層帶透明度的顏色,遮罩默認不繪制,當制定了遮罩顏色時才會繪制,實現很簡單:

例如加壹個透明度30%的紅色遮罩後的效果:

核心的實現邏輯就這些了,剩下的就是自定義屬性和方法了,有興趣的可以看源碼,都很簡單,希望對妳有所幫助吧!

更多細節及用法見GitHub: /SheHuan/NiceImageView

如果妳需要實現類似釘釘的圓形組合頭像,例如:

  • 上一篇:ui設計師的工作內容包括哪些
  • 下一篇:ASP.net的三層架構
  • copyright 2024編程學習大全網