drawPhaseTextInside method

void drawPhaseTextInside(
  1. Canvas canvas,
  2. Offset center,
  3. double radius,
  4. int startDay,
  5. int endDay,
  6. Color textColor,
  7. String label,
)

Draw Phase text inside circle like Menstruation, Ovulation etc

Implementation

void drawPhaseTextInside(Canvas canvas, Offset center, double radius,
    int startDay, int endDay, Color textColor, String label) {
  final startAngle = (2 * pi / totalCycleDays) * startDay - pi / 2;
  final sweepAngle = (2 * pi / totalCycleDays) * (endDay - startDay);

  final textPainter = TextPainter(
    textAlign: TextAlign.center,
    textDirection: TextDirection.ltr,
  );

  final labelAngle = startAngle + sweepAngle / 2;
  final labelRadius = radius / 2;
  final labelX = center.dx + labelRadius * cos(labelAngle);
  final labelY = center.dy + labelRadius * sin(labelAngle);

  /// Calculate rotation angle
  double rotationAngle;
  if (labelAngle > pi / 2 && labelAngle < 3 * pi / 2) {
    rotationAngle = labelAngle - pi;
  } else {
    rotationAngle = labelAngle;
  }

  canvas.save();
  canvas.translate(labelX, labelY);
  canvas.rotate(rotationAngle);
  canvas.translate(-labelX, -labelY);

  final labelText = TextSpan(
    text: label,
    style: TextStyle(
      color: textColor,
      fontSize: insidePhasesTextSize,
      fontWeight: FontWeight.bold,
    ),
  );

  textPainter.text = labelText;
  textPainter.layout();
  textPainter.paint(
    canvas,
    Offset(
      labelX - textPainter.width / 2,
      labelY - textPainter.height / 2,
    ),
  );

  canvas.restore();
}