Android切圓角的幾種常見方式總結
Android 中有哪些可以切圓角的實現方式呢?
本文總結一下常用的方式。
以下內容分為以下幾部分:
- 利用 Drawable 的 shape xml 實現
- CardView 實現圓角
- fresco 中的 SimpleDraweeView 實現圓角
- 利用 View 的 ViewOutlineProvider 實現圓角
- 總結
1. 利用 Drawable 的 shape xml 實現
很多時候,我們可以自定義一些 drawable,程式碼如下:
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android"> <corners android:radius="15dp"/> <solid android:color="#FFFFFF"/> <stroke android:width="1dp" android:color="#EBEBEB"/> </shape>
其中,corners 就是我們實現的圓角,這裡指定圓角的半徑為 15dp。
solid 是指填充色,這裡為白色;
stroke 為drawable 的邊緣寬度和顏色設定,這裡為 1dp 顏色比白色黑一點。
如果知識想要 「圓角」的話,可以不需要指定 stroke
然後在我們需要的 View 上,設定它的 background 為該 drawable 即可.
效果為:
drawable 圓角
本質是在 background 上加了圓角。
2. CardView 的圓角
CardView 是自帶圓角實現的,我們只需要在它的定義中加一句 app:cardCornerRadius="8dp" 即可。
程式碼如下:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.cardview.widget.CardView android:layout_width="256dp" android:layout_height="128dp" app:cardBackgroundColor="#0084FF" app:cardCornerRadius="16dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
設定該 CardView 圓角半徑為 16dp,
效果圖如下:
cardView 圓角
3. fresco 中的 SimpleDraweeView
fresco 是一個強大的圖片庫,裡面的 SimpleDraweeView 常用來載入圖片。
SimpleDraweeView 實現了很多功能,其中一個就是實現了圓角屬性 roundedCornerRadius
實現程式碼:
<com.facebook.drawee.view.SimpleDraweeView android:layout_width="256dp" android:layout_height="128dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:actualImageScaleType="centerCrop" app:roundedCornerRadius="3dp" />
這裡設定圖片圓形邊角為 3dp
實現效果為:
SimpleDraweeView 圓角
4. 利用 View 的 ViewOutlineProvider 實現圓角
這種實現方式,本質上是修改了 View 的輪廓。
程式碼實現:
itemView.outlineProvider = object : ViewOutlineProvider() { override fun getOutline(view: View,outline: Outline) { outline.setRoundRect(0,view.width,view.height,5.dp.toFloat()) } } // 開啟開關 itemView.clipToOutline = true
為整個 View 新增上圓角。
實現效果為:
outlineProvider 圓角
這樣的好處是,不需要給裡面的子 view 設定圓角,在最外層的 View 設定為圓角即可。
更大的好處是:比使用了第一種方式 drawable 的 xml 少了一層過度繪製。因為省去了設定的 background
利用 ViewOutlineProvider 的實現圓角,本質上是在 View 的畫布上畫了一個圓角的矩形。
setRoundRect(xxx)
同時 outline 還可以畫其他的一些內容。
outline.setRect(xxx)// 畫矩形 outline.setRoundRect(xxx)// 畫圓角矩形 outline.setOval(xxx) // 畫橢圓
同時,因為 outline.setRoundRect(0,5.dp.toFloat()) 是在一個矩形上畫的圓角。因為,當我們的矩形減小或增大時,有些圓角是沒有區域可畫,會形成部分圓角存在的情況。
既然提到了 ViewOutlineProvider,那就得提一下 StateListAnimator 這個動畫得效果, 感興趣得自己去搜索一下。可參考 StateListAnimator
5.總結
上面總結了一下常見的 Android 中實現圓角的方式,在使用過程中,怎麼方便怎麼來。
我個人最近比較喜歡用 ViewOutlineProvider,對輪廓進行剪下,高效且方便。
好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對我們的支援。