1. Drawable设置背景方式实现圆角
如代码,在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文件定义了一个红色的顶部圆角矩形,将该文件通过设置Drawable的方式设置为View的背景即可实现圆角效果,对于该文件,最终转换成Java类是android.graphics.drawable.GradientDrawable
,如果需要动态改变圆角的话可以通过改变GradientDrawable
对象的cornerRadii
属性然后重新将新的GradientDrawable
对象设置为View的background
即可,如下Kotlin代码示例:
// 取出View的背景
view.background?.let { -> it
// 判断是不是GradientDrawable类型
if (it is GradientDrawable) {
// 如果是通过解析xml获取到的GradientDrawable对象,因为Drawable的状态共享机制,
// 改变cornerRadii 属性前需要调用mutate()返回一个新对象
val mutateDrawable = it.mutate()
// 改变cornerRadii 属性,cornerRadii 是一个长度为8的float数组,按顺序依次表示
// 左上、右上、右下、左下的X轴和Y轴的圆角半径,如下面的形式就表示上面两个角为30像素
// 半径的圆角,下面两个角为直角
mutateDrawable.cornerRadii = floatArrayOf(30f, 30f, 30f, 30f, 0f, 0f, 0f, 0f)
view.background = mutateDrawable
}
}
2. ViewOutlineProvider方式实现圆角
ViewOutlineProvider方式实现圆角的本质是对View进行裁切,可以通过这种方式处理一些前面Drawable圆角处理不了的情况,例如为一个RecyclerView设置了圆角Drawable背景,但是子View滚动到圆角区域时会有出现在在圆角之外的视觉效果,这个时候就需要ViewOutlineProvider派上用场了,Kotlin示例代码如下:
// 启用轮廓裁剪
view.clipToOutline = true
// 设置裁剪
view.outlineProvider = object :ViewOutlineProvider() {
override fun getOutline(view: View, outline: Outline) {
// 圆角矩形方式裁剪,五个参数分别表示矩形的左、上、右、下、圆角半径
outline.setRoundRect(0,0,view.width, view.bottom, radius)
}
}
注意:ViewOutlineProvider方式实现圆角的性能要比Drawable方式要差一些