1. Drawable設(shè)置背景方式實現(xiàn)圓角
如代碼赤炒,在xml文件中定義圓角背景
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:topLeftRadius="30dp" android:topRightRadius="30dp"/>
<solid android:color="#FF0000"/>
</shape>
上面的xml文件定義了一個紅色的頂部圓角矩形蛙婴,將該文件通過設(shè)置Drawable的方式設(shè)置為View的背景即可實現(xiàn)圓角效果废岂,對于該文件,最終轉(zhuǎn)換成Java類是android.graphics.drawable.GradientDrawable
盲厌,如果需要動態(tài)改變圓角的話可以通過改變GradientDrawable
對象的cornerRadii
屬性然后重新將新的GradientDrawable
對象設(shè)置為View的background
即可燎孟,如下Kotlin代碼示例:
// 取出View的背景
view.background?.let { -> it
// 判斷是不是GradientDrawable類型
if (it is GradientDrawable) {
// 如果是通過解析xml獲取到的GradientDrawable對象,因為Drawable的狀態(tài)共享機制镜盯,
// 改變cornerRadii 屬性前需要調(diào)用mutate()返回一個新對象
val mutateDrawable = it.mutate()
// 改變cornerRadii 屬性岸裙,cornerRadii 是一個長度為8的float數(shù)組,按順序依次表示
// 左上速缆、右上降允、右下、左下的X軸和Y軸的圓角半徑艺糜,如下面的形式就表示上面兩個角為30像素
// 半徑的圓角剧董,下面兩個角為直角
mutateDrawable.cornerRadii = floatArrayOf(30f, 30f, 30f, 30f, 0f, 0f, 0f, 0f)
view.background = mutateDrawable
}
}
2. ViewOutlineProvider方式實現(xiàn)圓角
ViewOutlineProvider方式實現(xiàn)圓角的本質(zhì)是對View進行裁切,可以通過這種方式處理一些前面Drawable圓角處理不了的情況破停,例如為一個RecyclerView設(shè)置了圓角Drawable背景翅楼,但是子View滾動到圓角區(qū)域時會有出現(xiàn)在在圓角之外的視覺效果,這個時候就需要ViewOutlineProvider派上用場了真慢,Kotlin示例代碼如下:
// 啟用輪廓裁剪
view.clipToOutline = true
// 設(shè)置裁剪
view.outlineProvider = object :ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
// 圓角矩形方式裁剪毅臊,五個參數(shù)分別表示矩形的左、上黑界、右管嬉、下、圓角半徑
outline.setRoundRect(0,0,view.width, view.bottom, radius)
}
}
注意:ViewOutlineProvider方式實現(xiàn)圓角的性能要比Drawable方式要差一些