文章

BorderRadius的不同样式的圆角

BorderRadius 的不同样式的圆角

BorderRadius的不同样式的圆角

BorderRadius 的不同样式的圆角

在 Flutter 中,BorderRadius 的不同构造函数用于创建不同样式的圆角。以下是它们的区别:

1. BorderRadius.zero - 无圆角

1
2
3
BorderRadius.zero
// 等同于:BorderRadius.all(Radius.zero)
// 所有角都没有圆角,直角

效果: 四个角都是直角\ 使用场景: 不需要圆角时

2. BorderRadius.circular() - 统一圆角

1
2
3
BorderRadius.circular(10.0)
// 等同于:BorderRadius.all(Radius.circular(10.0))
// 所有角都有相同的圆角半径

效果: 四个角都是相同的圆角\ 使用场景: 需要统一圆角时

3. BorderRadius.all() - 统一圆角(更灵活)

1
2
BorderRadius.all(Radius.circular(10.0))  // 圆形圆角
BorderRadius.all(Radius.elliptical(20.0, 10.0))  // 椭圆圆角

效果: 四个角都有相同的圆角(可以是圆形或椭圆形)\ 使用场景: 需要统一但更复杂的圆角时

4. BorderRadius.only() - 指定角圆角

1
2
3
4
5
6
BorderRadius.only(
  topLeft: Radius.circular(10.0),
  topRight: Radius.circular(20.0),
  bottomLeft: Radius.circular(15.0),
  bottomRight: Radius.zero,  // 直角
)

效果: 可以单独设置每个角的圆角\ 使用场景: 需要不同角有不同圆角时

5. BorderRadius.vertical() - 垂直方向圆角

1
2
3
4
BorderRadius.vertical(
  top: Radius.circular(20.0),    // 顶部两个角
  bottom: Radius.circular(10.0), // 底部两个角
)

效果: 顶部两个角相同,底部两个角相同\ 使用场景: 列表项、卡片等需要顶部和底部不同圆角时

6. BorderRadius.horizontal() - 水平方向圆角

1
2
3
4
BorderRadius.horizontal(
  left: Radius.circular(15.0),  // 左边两个角
  right: Radius.circular(5.0),  // 右边两个角
)

效果: 左边两个角相同,右边两个角相同\ 使用场景: 侧边栏、菜单等需要左右不同圆角时

7. BorderRadius.lerp() - 插值动画

1
2
BorderRadius.lerp(start, end, t)
// 在两个BorderRadius之间进行插值,用于动画

效果: 根据时间因子 t 在 start 和 end 之间平滑过渡\ 使用场景: 圆角动画效果

示例对比

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 1. 无圆角
Container(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.zero,
    color: Colors.blue,
  ),
)

  // 2. 统一圆角
  Container(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.circular(16.0),
    color: Colors.red,
  ),
)

  // 3. 指定角圆角
  Container(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.only(
      topLeft: Radius.circular(20.0),
      topRight: Radius.circular(20.0),
    ),
    color: Colors.green,
  ),
)

  // 4. 垂直方向圆角
  Container(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.vertical(
      top: Radius.circular(25.0),
    ),
    color: Colors.orange,
  ),
)

  // 5. 椭圆圆角
  Container(
  decoration: BoxDecoration(
    borderRadius: BorderRadius.all(
      Radius.elliptical(30.0, 15.0), // 水平30,垂直15
    ),
    color: Colors.purple,
  ),
)

实际应用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 按钮 - 统一圆角
ElevatedButton(
  style: ElevatedButton.styleFrom(
    shape: RoundedRectangleBorder(
      borderRadius: BorderRadius.circular(8.0),
    ),
  ),
)

  // 卡片 - 顶部圆角
  Card(
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.vertical(
      top: Radius.circular(16.0),
    ),
  ),
)

  // 对话框 - 所有角圆角
  AlertDialog(
  shape: RoundedRectangleBorder(
    borderRadius: BorderRadius.circular(20.0),
  ),
)

  // 列表项 - 第一个和最后一个不同
  ListView.builder(
  itemBuilder: (context, index) {
    return Container(
      margin: EdgeInsets.symmetric(horizontal: 16.0),
      decoration: BoxDecoration(
        borderRadius: index == 0 
        ? BorderRadius.vertical(top: Radius.circular(12.0))
        : index == itemCount - 1
        ? BorderRadius.vertical(bottom: Radius.circular(12.0))
        : BorderRadius.zero,
      ),
    );
  },
)

总结

  • **zero**: 无圆角
  • **circular**: 统一圆形圆角
  • **all**: 统一圆角(支持椭圆)
  • **only**: 自定义每个角
  • **vertical**: 垂直方向控制
  • **horizontal**: 水平方向控制
  • **lerp**: 动画插值
本文由作者按照 CC BY 4.0 进行授权