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

如何在Flutter中实现指定样式的顶部路径裁剪器

问题原因

  • 现有代码绘制的是顶部向上凸起的弧形,和你需要的向下凹陷效果完全相反
  • 硬编码的40px高度未做尺寸适配,不同设备下显示效果会出现变形

调整后代码

class CustomClipPath extends CustomClipper<Path> {
  // 凹陷的半径,可根据悬浮按钮尺寸调整
  final double indentRadius = 28;
  // 凹陷左右预留的边距,可自行调整
  final double padding = 12;

  @override
  Path getClip(Size size) {
    final path = Path();
    // 起点定位到左上角
    path.moveTo(0, 0);
    // 绘制到凹陷左侧起点
    path.lineTo(size.width / 2 - indentRadius - padding, 0);
    // 第一段贝塞尔曲线绘制凹陷左半弧
    path.quadraticBezierTo(
      size.width / 2 - indentRadius, 
      0, 
      size.width / 2 - indentRadius / 2, 
      indentRadius / 2
    );
    // 第二段贝塞尔曲线绘制凹陷底部弧
    path.quadraticBezierTo(
      size.width / 2, 
      indentRadius, 
      size.width / 2 + indentRadius / 2, 
      indentRadius / 2
    );
    // 第三段贝塞尔曲线接回顶部右侧
    path.quadraticBezierTo(
      size.width / 2 + indentRadius, 
      0, 
      size.width / 2 + indentRadius + padding, 
      0
    );
    // 绘制到右上角
    path.lineTo(size.width, 0);
    // 绘制到右下角
    path.lineTo(size.width, size.height);
    // 绘制到左下角
    path.lineTo(0, size.height);
    // 闭合路径
    path.close();
    return path;
  }

  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) {
    return true;
  }
}

使用说明

可根据你的实际设计需求调整indentRadius和padding两个参数:

  • indentRadius控制凹陷的深度,数值越大凹陷越深
  • padding控制凹陷和侧边的间距,避免和按钮产生边界重叠
  • 所有计算基于组件实际尺寸,适配不同宽度的屏幕不会变形

内容的提问来源于stack exchange,提问作者Hos morty

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:48:03