Flutter CustomPainter - сбривает края дуги

Я использую класс Flutter, чтобы нарисовать форму, которая похожа на кусочки пиццы. Это несколько дуг, составляющих круг. Мне нужно создать желоб между дугами.

Я попытался изменить параметры на canvas.drawArc ( startAngle и sweepAngle), который работает, но это не совсем то, что мне нужно.

Прямо сейчас мой желоб есть, но стороны дуги соприкасаются в центре, а это не тот вид, к которому я стремлюсь. Я хочу в основном сбрить стороны нарисованной дуги, чтобы она перешла от моего существующего решения (слева) к желаемому (справа):

Думаю, мне нужно обрезать существующую форму, но я не уверен, как этого добиться.

Это пример моего CustomPainter учебный класс:

      
class PizzaCounterShape extends CustomPainter {
  PizzaCounterShape({
    required this.count,
    required this.maxCount,
    required this.gutterWidth,
    required this.startAngle,
    required this.backgroundColor,
    required this.foregroundColor,
  }) {
    partInRadians = PizzaCounter.circleRadians / maxCount;
    sweepAngle = (pi / maxCount);
  }

  final int count;
  final int maxCount;
  final double gutterWidth;
  final double startAngle;
  final Color backgroundColor;
  final Color foregroundColor;
  late double partInRadians;
  late double sweepAngle;

  @override
  void paint(Canvas canvas, Size size) {
    canvas.drawRect(Rect.fromLTWH(0, 0, size.width, size.height),
        Paint()..color = Colors.blue);

    final arcPaint = Paint()
      ..color = backgroundColor
      ..strokeWidth = 5
      ..strokeCap = StrokeCap.round;

    final rect = Rect.fromCenter(
      center: Offset(size.width / 2, size.height / 2),
      height: size.height,
      width: size.width,
    );

    List<int>.generate(maxCount, (i) => i).forEach((i) {
      _paintArc(
          canvas: canvas, rect: rect, paint: arcPaint, index: i);
    });
  }

  void _paintArc({
    required Canvas canvas,
    required Rect rect,
    required Paint paint,
    required int index,
  }) {
    final partStartAngle = _getStartAngle(index);
    final partSweepAngle = partInRadians - gutterWidth;
    final active = (index + 1) <= count;

    paint.color = active ? foregroundColor : backgroundColor;

    canvas.drawArc(
        rect,
        partStartAngle,
        partSweepAngle,
        true,
        paint);
  }

  double _getStartAngle(int index) {
    final baseStartAngle = startAngle + (partInRadians * index);

    return baseStartAngle < PizzaCounter.circleRadians
        ? baseStartAngle
        : baseStartAngle - PizzaCounter.circleRadians;
  }


  @override
  bool shouldRepaint(PizzaCounterShape oldDelegate) {
    return 
        oldDelegate.count != count
        || oldDelegate.maxCount != maxCount
        || oldDelegate.gutterWidth != gutterWidth
        || oldDelegate.startAngle != startAngle
        || oldDelegate.foregroundColor != foregroundColor
        || oldDelegate.backgroundColor != backgroundColor;
  }
}


maxCount переменная определяет количество срезов, составляющих круг.

0 ответов

Другие вопросы по тегам