一种可以不通过 xml 来实现圆角的方案

通过 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
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值