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
即可.
效果為:
本質是在 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
,
效果圖如下:
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
實現效果為:
4. 利用 View
的 ViewOutlineProvider
實現圓角
這種實現方式,本質上是修改了 View
的輪廓。
代碼實現:
itemView.outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
outline.setRoundRect(0, 0, view.width, view.height, 5.dp.toFloat())
}
}
// 打開開關
itemView.clipToOutline = true
為整個 View
添加上圓角。
實現效果為:
這樣的好處是,不需要給里面的子 view
設置圓角,在最外層的 View
設置為圓角即可。
更大的好處是:比使用了第一種方式 drawable
的 xml
少了一層過度繪制。因為省去了設置的 background
利用 ViewOutlineProvider
的實現圓角,本質上是在 View
的畫布上畫了一個圓角的矩形。
setRoundRect(xxx)
同時 outline
還可以畫其他的一些內容。
outline.setRect(xxx)// 畫矩形
outline.setRoundRect(xxx)// 畫圓角矩形
outline.setOval(xxx) // 畫橢圓
同時,因為 outline.setRoundRect(0, 0, view.width, view.height, 5.dp.toFloat())
是在一個矩形上畫的圓角。因為,當我們的矩形減小或增大時,有些圓角是沒有區域可畫,會形成部分圓角存在的情況。
既然提到了 ViewOutlineProvider
, 那就得提一下 StateListAnimator
這個動畫得效果, 感興趣得自己去搜索一下。可參考 StateListAnimator
5.總結
上面總結了一下常見的 Android
中實現圓角的方式,在使用過程中,怎么方便怎么來。
我個人最近比較喜歡用 ViewOutlineProvider
, 對輪廓進行剪切,高效且方便。
2019.12.6 by chendroid
PS:
再水一下
balabala