美文网首页
Android通过Drawable和ViewOutlinePro

Android通过Drawable和ViewOutlinePro

作者: 小智在不在 | 来源:发表于2023-04-26 14:05 被阅读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方式要差一些

    相关文章

      网友评论

          本文标题:Android通过Drawable和ViewOutlinePro

          本文链接:https://www.haomeiwen.com/subject/sajmjdtx.html