You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中创建带倾斜与曲线效果的容器?

在Flutter中实现带曲线效果的容器

要实现图中的曲线容器,最直接的方式是用Flutter的ClipPath结合自定义CustomClipper来裁剪容器,以下是具体代码示例:

步骤1:自定义裁剪器

创建一个CustomClipper子类,通过贝塞尔曲线绘制底部的特殊形状:

class CurvedContainerClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final path = Path();
    // 从左上角开始绘制路径
    path.moveTo(0, 0);
    // 画到右上角
    path.lineTo(size.width, 0);
    // 右侧边缘向下到曲线起点
    path.lineTo(size.width, size.height - 30);
    // 右侧内凹曲线(二阶贝塞尔)
    path.quadraticBezierTo(
      size.width - 30,  // 控制点X
      size.height,      // 控制点Y
      size.width - 60,  // 终点X
      size.height - 30, // 终点Y
    );
    // 中间向上凸起的曲线
    path.quadraticBezierTo(
      size.width / 2,       // 控制点X
      size.height - 40,     // 控制点Y(数值越小凸起越高)
      60,                   // 终点X
      size.height - 30,     // 终点Y
    );
    // 左侧内凹曲线
    path.quadraticBezierTo(
      30,                // 控制点X
      size.height,       // 控制点Y
      0,                 // 终点X
      size.height - 30,  // 终点Y
    );
    // 闭合路径
    path.close();
    return path;
  }

  @override
  bool shouldReclip(covariant CustomClipper<Path> oldClipper) => false;
}

步骤2:使用裁剪器包装容器

把需要的容器用ClipPath包裹,即可得到曲线效果:

class CurvedCard extends StatelessWidget {
  const CurvedCard({super.key});

  @override
  Widget build(BuildContext context) {
    return ClipPath(
      clipper: CurvedContainerClipper(),
      child: Container(
        height: 200,
        width: double.infinity,
        margin: const EdgeInsets.symmetric(horizontal: 20),
        decoration: BoxDecoration(
          color: Colors.blueAccent,
          borderRadius: const BorderRadius.only(
            topLeft: Radius.circular(16),
            topRight: Radius.circular(16),
          ),
          boxShadow: [
            BoxShadow(
              color: Colors.black.withOpacity(0.1),
              blurRadius: 10,
              offset: const Offset(0, 5),
            )
          ],
        ),
        child: const Center(
          child: Text(
            "带曲线的容器",
            style: TextStyle(color: Colors.white, fontSize: 18),
          ),
        ),
      ),
    );
  }
}

调整匹配设计图

你可以修改裁剪器里的数值(比如30、60、size.height -40这些参数),来调整曲线的弧度、深度和凸起高度,完全匹配Figma里的设计。如果需要更精准的曲线,可以在Figma中导出路径的坐标点,直接对应到Flutter的Path方法中。


内容的提问来源于stack exchange,提问作者Sublime Developer5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:36:49