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

使用CustomPainter绘图时线条总是以圆形结尾的问题求助

解决CustomPainter绘制线条出现圆形结尾的问题

核心问题分析

你的代码中主动在每条线条的终点绘制了圆形(paint方法里的else if分支),这是导致每条线都有圆形结尾的直接原因。

修改步骤

1. 移除主动绘制圆形的逻辑

删除paint方法中额外绘制圆形的分支,改用更简洁的逻辑连接有效点位:

@override
void paint(Canvas canvas, Size size) {
  Offset? previousPoint;
  for (final point in points) {
    if (point.isInfinite) {
      previousPoint = null;
      continue;
    }
    if (previousPoint != null) {
      canvas.drawLine(previousPoint, point, _paint);
    }
    previousPoint = point;
  }
}

这个逻辑会自动跳过Offset.infinite分隔符,连续连接正常点位,不会额外生成圆形结尾。

2. 显式设置Paint的端点样式(可选)

如果需要线条两端完全平整,初始化Paint时显式指定strokeCap:

@override
void initState() {
  super.initState();
  _paint = Paint()
    ..color = Colors.black
    ..strokeWidth = 8
    ..strokeCap = StrokeCap.butt; // 平端样式,默认即为该值,可按需改为square/round
}

3. 保留原有手势逻辑

GestureDetector中存储点位和添加分隔符的逻辑无需修改,可继续用于区分不同笔画。

修改后的关键代码片段

Paint初始化:
@override
void initState() {
  super.initState();
  _paint = Paint()
    ..color = Colors.black
    ..strokeWidth = 8
    ..strokeCap = StrokeCap.butt;
}
DrawingPainter的paint方法:
@override
void paint(Canvas canvas, Size size) {
  Offset? previous;
  for (final point in points) {
    if (point.isInfinite) {
      previous = null;
      continue;
    }
    if (previous != null) {
      canvas.drawLine(previous, point, _paint);
    }
    previous = point;
  }
}

修改后绘制的线条将不再出现多余的圆形结尾,呈现正常的连续线条效果。

内容的提问来源于stack exchange,提问作者Anas Hafidi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 09:10:40