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

Flutter自定义贝塞尔曲线实现求助:如何达成目标曲线效果?

实现Flutter双曲线背景的解决方案

你想要实现的是顶部带有两条向下凹陷的半透明白色背景效果,现有代码的路径逻辑有误,导致效果异常。先看你的初始代码:

ClipPath(
    clipper: BackgroudCliper(),
    child: Container(
      height: 200,
      color: Colors.white.withOpacity(0.20),
    ),
  ),

Path getClip(Size size) {
var path = Path();
path.lineTo(0.0, size.height);
path.lineTo(size.width, size.height);
path.quadraticBezierTo(size.width / 20, size.height / 20, 0, size.height);
path.close();
return path;
}

问题分析

原代码的路径起点和贝塞尔曲线参数逻辑错误,而且只尝试绘制了一条曲线,无法实现双凹陷的效果。

修正后的代码

下面是能实现目标效果的自定义Clipper:

class BackgroundClipper extends CustomClipper<Path> {
  @override
  Path getClip(Size size) {
    final path = Path();
    // 从左上角开始
    path.moveTo(0, 0);
    
    // 第一条曲线:从左上角到中间偏左的凹陷点
    path.quadraticBezierTo(
      size.width * 0.25, // 控制点X:宽度的25%位置
      size.height * 0.3, // 控制点Y:高度的30%位置(控制凹陷深度)
      size.width * 0.5,  // 终点X:宽度中点
      size.height * 0.15, // 终点Y:高度的15%位置
    );
    
    // 第二条曲线:从中间偏左到右上角的凹陷点
    path.quadraticBezierTo(
      size.width * 0.75, // 控制点X:宽度的75%位置
      0, // 控制点Y:顶部(控制凹陷弧度)
      size.width,  // 终点X:右上角
      0, // 终点Y:右上角
    );
    
    // 连接右下角和左下角,闭合路径
    path.lineTo(size.width, size.height);
    path.lineTo(0, size.height);
    path.close();
    
    return path;
  }

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

使用方式

直接替换你原来的BackgroudCliper即可,容器高度保持200就能得到类似目标效果:

ClipPath(
  clipper: BackgroundClipper(),
  child: Container(
    height: 200,
    color: Colors.white.withOpacity(0.2),
  ),
)

你可以调整贝塞尔曲线的控制点参数(比如size.width * 0.25、size.height * 0.3这些数值),来匹配图中曲线的弧度和凹陷深度。

内容的提问来源于stack exchange,提问作者Gayatri Dyunakhe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 16:27:23