通过 ShapeAppearanceModel 来实现
val shapeAppearanceModel = ShapeAppearanceModel.builder().apply {
setAllCorners(RoundedCornerTreatment()) // 设置全部角 如若需要对单独某个角设置 可以针对 比如 topLeft topRight
setAllCornerSizes(12F) // 设置圆角的大小,如若需要某个角 可以 topLeft topRight
}.build()
val drawable = MaterialShapeDrawable(shapeAppearanceModel).apply {
setTint(topBgColor) // 设置背景颜
paintStyle = Paint.Style.FILL // 填充,边框,填充和边框
strokeWidth = 1F.dp() // 边框宽度
strokeColor = ColorStateList.valueOf(borderColor)// 边框颜色
}
binding.topView.background = drawable // 设置给需要的的 View
这种方法可以避免重复写 XML 文件,可以提取作为公共方法,提高代码简洁
附上一个 Demo 里面多种多样
GitHub - VolodyaVechirko/MaterialShapeView: MaterialShapeDrawable usage sample
/**
* 圆角工具类
*/
object ViewRoundedUtil {
/**
* 四个角为圆角,切大小统一 默认为实心 不带边框
* @param view 需要添加圆角的 View
* @param roundedSize 圆角大小
* @param bgColor 背景颜色
*/
fun allRounded(view: View, roundedSize: Float, bgColor: Int? = null) {
viewRounded(view, roundedSize, roundedSize, roundedSize, roundedSize, bgColor)
}
/**
* 四个角为圆角,切大小统一 默认为实心
* @param view 需要添加圆角的 View
* @param roundedSize 圆角大小
* @param bgColor 背景颜色
*/
fun allRoundedBorder(
view: View,
roundedSize: Float,
bgColor: Int?,
borderWidth: Float?,
borderColor: Int?
) {
viewRounded(
view,
roundedSize,
roundedSize,
roundedSize,
roundedSize,
bgColor,
borderWidth,
borderColor
)
}
/**
* 设置上面两个角的圆角
* @param view 需要添加圆角的 View
* @param roundedSize 圆角大小
* @param bgColor 背景颜色
*/
fun setTopRounded(view: View, roundedSize: Float, bgColor: Int? = null) {
viewRounded(view, roundedSize, roundedSize, 0f, 0f, bgColor)
}
/**
* 设置下面两个角的圆角
* @param view 需要添加圆角的 View
* @param roundedSize 圆角大小
* @param bgColor 背景颜色
*/
fun setBottomRounded(view: View, roundedSize: Float, bgColor: Int? = null) {
viewRounded(view, 0F, 0F, roundedSize, roundedSize, bgColor)
}
/**
* 四个角为圆角,且大小不统一
* @param view 需要添加圆角的 View
* @param topLeftSize 上左圆角大小
* @param topRightSize 上右圆角大小
* @param bottomLeftSize 下左圆角大小
* @param bottomRightSize 下右圆角大小
* @param bgColor 背景颜色
* @param borderWidth 边框宽度
* @param borderColor 边框颜色
*/
fun viewRounded(
view: View,
topLeftSize: Float,
topRightSize: Float,
bottomLeftSize: Float,
bottomRightSize: Float,
bgColor: Int? = Color.WHITE,
borderWidth: Float? = null,
borderColor: Int? = null
) {
val shapeAppearanceModel = ShapeAppearanceModel.builder().apply {
setAllCorners(RoundedCornerTreatment())
setTopLeftCornerSize(topLeftSize)
setTopRightCornerSize(topRightSize)
setBottomLeftCornerSize(bottomLeftSize)
setBottomRightCornerSize(bottomRightSize)
}.build()
val drawable = MaterialShapeDrawable(shapeAppearanceModel).apply {
bgColor?.let { setTint(it) } // 背景填充颜色
borderWidth?.let { strokeWidth = it } // 边框宽度
borderColor?.let { strokeColor = ColorStateList.valueOf(it) } // 边框颜色
paintStyle = Paint.Style.FILL_AND_STROKE // 模式为 边框+填充
}
view.background = drawable
}
}