代码和效果
Container(
height: 42,
width: 140,
clipBehavior: Clip.antiAlias,
decoration: BoxDecoration(
borderRadius: BorderRadius.all(Radius.circular(18)),
),
child: ElevatedButton(
onPressed: () {},
style: ButtonStyle(
// elevation: 设置阴影, 0 表示无阴影
elevation: WidgetStateProperty.all(0),
// 设置按钮的最小尺寸为 0,Size.zero 的意思是宽度和高度都为 0
// 也就是说,按钮的实际大小将由其内容决定
minimumSize: WidgetStateProperty.all(Size.zero),
backgroundColor: WidgetStateProperty.all(Colors.orange),
),
child: const Text(
"Get Started",
style: TextStyle(
fontSize: 16,
fontWeight: FontWeight.w300,
color: Colors.white,
),
),
),
),

clipBehavior
在 Flutter 里,Container
的 clipBehavior 决定了子组件在超出 Container
边界时的裁剪方式。
clipBehavior 的几种取值
Clip.none
(默认值):不裁剪,超出的内容照样显示。Clip.hardEdge
:直接裁剪掉超出的部分,边缘是硬切割,不会做抗锯齿。Clip.antiAlias
:裁剪掉超出部分,边缘使用抗锯齿算法(平滑处理),看起来不会有明显的锯齿。Clip.antiAliasWithSaveLayer
:在antiAlias
的基础上,多加了一个saveLayer
(图层缓存),适合半透明/复杂形状,但性能开销更大。
Clip.hardEdge
和 Clip.antiAlias
在很多时候肉眼看过去确实差不多,尤其是在 高清屏幕、圆角半径比较小、背景对比不明显 的情况下。
Container(
width: 200,
height: 200,
decoration: BoxDecoration(
// 这里设置了圆角
borderRadius: BorderRadius.circular(50),
),
clipBehavior: Clip.none,
child: Image.asset(
"assets/images/13399635147767705.jpg",
fit: BoxFit.cover,
),
),
我们设置的Container
是200*200
的大小,并且设置了一个50
的圆角(BorderRadius.circular(50)
)。

这个时候裁剪方式选择的是Clip.none
,也就是默认的 不裁剪。
Container(
width: 200,
height: 200,
decoration: BoxDecoration(
// 这里设置了圆角
borderRadius: BorderRadius.circular(50),
),
clipBehavior: Clip.antiAlias,// 设置裁剪
child: Image.asset(
"assets/images/13399635147767705.jpg",
fit: BoxFit.cover,
),
),

当我们设置了裁剪方式Clip.antiAlias
之后,我们发现,我们设置的圆角生效了BorderRadius.circular(50)
。
原理
由于Container
设置了严格约束(width: 200,height: 200,
),所以Image
的大小就等于width: 200,height: 200,
。我们在Image
里面虽然没有设置裁剪,但是Container
设置了圆角和裁剪。所以当Image
里面的元素超过了Container
,那么超出的元素也会别裁剪。
注意
圆角是否出现和clipBehavior
没有关系。即使没有写 clipBehavior
,圆角依然会显示出来。是否有圆角取决于borderRadius
这个配置。
clipBehavior
支付者裁剪,和圆角其实没有关系。在上面的这个例子中,由于图片超过了Container的范围,但是我们看不到圆角,所以需要裁剪。
Container(
width: 200,
height: 200,
decoration: BoxDecoration(
color: Colors.red,
// 这里设置了圆角
borderRadius: BorderRadius.circular(50),
),
// clipBehavior: Clip.antiAlias, // 设置裁剪
child: Text(
"---------AAAAAAAABBBBBBBBBB",
style: TextStyle(fontSize: 50),
),
),
],

在上面这个案例中,由于文字不会盖住圆角,所以圆角还是存在的。而clipBehavior: Clip.antiAlias
只是用过修剪移除Containner
的元素。