Android 中常见切圆角的方式

Android 切圆角的方式

Android 中有哪些可以切圆角的实现方式呢?

本文总结一下常用的方式。
以下内容分为以下几部分:

  1. 利用 Drawableshape xml 实现
  2. CardView 实现圆角
  3. fresco 中的 SimpleDraweeView 实现圆角
  4. 利用 ViewViewOutlineProvider 实现圆角
  5. 总结
1. 利用 Drawableshape xml 实现

很多时候,我们可以自定义一些 drawable , 代码如下:



    
    
    

其中,corners 就是我们实现的圆角,这里指定圆角的半径为 15dp

solid 是指填充色,这里为白色;
stroke 为drawable 的边缘宽度和颜色设置,这里为 1dp 颜色比白色黑一点。
如果知识想要 「圆角」的话,可以不需要指定 stroke

然后在我们需要的 View 上,设置它的 background 为该 drawable 即可.

效果为:


Android 中常见切圆角的方式_第1张图片
drawable 圆角

本质是在 background 上加了圆角。

2. CardView 的圆角

CardView 是自带圆角实现的,我们只需要在它的定义中加一句 app:cardCornerRadius="8dp" 即可。

代码如下:




    


设置该 CardView 圆角半径为 16dp,
效果图如下:

Android 中常见切圆角的方式_第2张图片
cardView 圆角

3. fresco 中的 SimpleDraweeView

fresco 是一个强大的图片库,里面的 SimpleDraweeView 常用来加载图片。
SimpleDraweeView 实现了很多功能,其中一个就是实现了圆角属性 roundedCornerRadius

实现代码:

 

这里设置图片圆形边角为 3dp
实现效果为:

Android 中常见切圆角的方式_第3张图片
SimpleDraweeView 圆角
4. 利用 ViewViewOutlineProvider 实现圆角

这种实现方式,本质上是修改了 View 的轮廓。
代码实现:

itemView.outlineProvider = object : ViewOutlineProvider() {
    override fun getOutline(view: View, outline: Outline) {
        outline.setRoundRect(0, 0, view.width, view.height, 5.dp.toFloat())
    }
}
// 打开开关
itemView.clipToOutline = true

为整个 View 添加上圆角。
实现效果为:

Android 中常见切圆角的方式_第4张图片
outlineProvider 圆角

这样的好处是,不需要给里面的子 view 设置圆角,在最外层的 View 设置为圆角即可。
更大的好处是:比使用了第一种方式 drawablexml 少了一层过度绘制。因为省去了设置的 background

利用 ViewOutlineProvider 的实现圆角,本质上是在 View 的画布上画了一个圆角的矩形。

setRoundRect(xxx)

同时 outline 还可以画其他的一些内容。

outline.setRect(xxx)// 画矩形
outline.setRoundRect(xxx)// 画圆角矩形
outline.setOval(xxx) // 画椭圆

同时,因为 outline.setRoundRect(0, 0, view.width, view.height, 5.dp.toFloat()) 是在一个矩形上画的圆角。因为,当我们的矩形减小或增大时,有些圆角是没有区域可画,会形成部分圆角存在的情况。

既然提到了 ViewOutlineProvider , 那就得提一下 StateListAnimator 这个动画得效果, 感兴趣得自己去搜索一下。可参考 StateListAnimator

5.总结

上面总结了一下常见的 Android 中实现圆角的方式,在使用过程中,怎么方便怎么来。
我个人最近比较喜欢用 ViewOutlineProvider, 对轮廓进行剪切,高效且方便。

2019.12.6 by chendroid

PS: 再水一下

balabala

Android 中常见切圆角的方式_第5张图片
Droid 二三事.jpg

你可能感兴趣的:(Android 中常见切圆角的方式)