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

如何在CustomPainter绘制的矩形之间添加间距或内边距?

解决方案

问题根因

原有代码的核心问题是X轴定位逻辑错误:每个矩形的水平中心仅相差1px,但矩形本身宽度就达15px,因此矩形会完全重叠,自然看不到间隔。同时sample.indexOf(i)的写法存在bug,当列表内有重复数值时会获取到错误的索引,导致绘制位置异常。

优化方案

我们可以通过新增可调参数、重构定位逻辑实现间距和内边距的控制:

  • 新增可配置参数:rectWidth控制矩形宽度、spacing控制矩形间的间距、horizontalPadding控制整体绘制区域的左右内边距
  • 改用带索引的循环遍历,避免重复值导致的索引错误
  • 重新计算每个矩形的X轴位置:第i个矩形的中心X坐标 = 左侧内边距 + i * (矩形宽度 + 间距) + 矩形宽度/2,保证相邻矩形间隔符合预期

修改后完整代码

import 'package:flutter/material.dart';

class RectPath extends CustomPainter {
  final List<double> sample;
  // 可自行调整以下参数修改样式
  final double rectWidth = 15; // 矩形宽度
  final double spacing = 8; // 矩形之间的间距
  final double horizontalPadding = 12; // 整体左右内边距

  RectPath(this.sample);

  @override
  void paint(Canvas canvas, Size size) {
    Paint paint = Paint()..color = Colors.lightGreen;
    // 改用带索引的循环,避免indexOf的bug
    for (int i = 0; i < sample.length; i++) {
      double value = sample[i];
      // 重新计算X轴中心坐标
      double centerX = horizontalPadding + i * (rectWidth + spacing) + rectWidth / 2;
      canvas.drawRect(
          Rect.fromCenter(
              center: Offset(centerX, 25.0), 
              width: rectWidth, 
              height: value * 0.8
          ),
          paint,
      );
    }
  }

  @override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }
}

参数调整说明

  • 增大spacing数值即可增加矩形之间的间隔,减小则缩小间隔
  • 修改rectWidth可以调整矩形本身的宽度
  • 修改horizontalPadding可以调整整体绘制区域和画布左右边缘的内边距,避免矩形贴边

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 20:36:05