Android通过Drawable和ViewOutlinePro

2023-04-26  本文已影响0人  小智在不在

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方式要差一些

上一篇下一篇

猜你喜欢

热点阅读