flutter:使用Container实现圆角的裁切

  1. 代码和效果
  2. clipBehavior
  3. 原理
  4. 注意

代码和效果

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 里,ContainerclipBehavior 决定了子组件在超出 Container 边界时的裁剪方式。

clipBehavior 的几种取值

  • Clip.none (默认值):不裁剪,超出的内容照样显示。
  • Clip.hardEdge:直接裁剪掉超出的部分,边缘是硬切割,不会做抗锯齿。
  • Clip.antiAlias:裁剪掉超出部分,边缘使用抗锯齿算法(平滑处理),看起来不会有明显的锯齿。
  • Clip.antiAliasWithSaveLayer:在 antiAlias 的基础上,多加了一个 saveLayer(图层缓存),适合半透明/复杂形状,但性能开销更大。

Clip.hardEdgeClip.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,
  ),
),

我们设置的Container200*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的元素。

×

喜欢就点赞,疼爱就打赏