paint method

  1. @override
void paint(
  1. PaintingContext context,
  2. Offset offset, {
  3. required RenderBox parentBox,
  4. required AnnotatedSliderThemeData sliderTheme,
  5. required Animation<double> enableAnimation,
  6. required Offset startThumbCenter,
  7. required Offset endThumbCenter,
  8. bool isEnabled = false,
  9. bool isDiscrete = false,
  10. required TextDirection textDirection,
  11. double additionalActiveTrackHeight = 2,
})
override

Implementation

@override
void paint(
  PaintingContext context,
  Offset offset, {
  required RenderBox parentBox,
  required AnnotatedSliderThemeData sliderTheme,
  required Animation<double> enableAnimation,
  required Offset startThumbCenter,
  required Offset endThumbCenter,
  bool isEnabled = false,
  bool isDiscrete = false,
  required TextDirection textDirection,
  double additionalActiveTrackHeight = 2,
}) {
  assert(sliderTheme.disabledActiveTrackColor != null);
  assert(sliderTheme.disabledInactiveTrackColor != null);
  assert(sliderTheme.activeTrackColor != null);
  assert(sliderTheme.inactiveTrackColor != null);
  assert(sliderTheme.rangeThumbShape != null);

  if (sliderTheme.trackHeight == null || sliderTheme.trackHeight! <= 0) {
    return;
  }

  // Assign the track segment paints, which are left: active, right: inactive,
  // but reversed for right to left text.
  final ColorTween activeTrackColorTween = ColorTween(
    begin: sliderTheme.disabledActiveTrackColor,
    end: sliderTheme.activeTrackColor,
  );
  final ColorTween inactiveTrackColorTween = ColorTween(
    begin: sliderTheme.disabledInactiveTrackColor,
    end: sliderTheme.inactiveTrackColor,
  );
  final Paint activePaint =
      Paint()..color = activeTrackColorTween.evaluate(enableAnimation)!;
  final Paint inactivePaint =
      Paint()..color = inactiveTrackColorTween.evaluate(enableAnimation)!;

  final (
    Offset leftThumbOffset,
    Offset rightThumbOffset,
  ) = switch (textDirection) {
    TextDirection.ltr => (startThumbCenter, endThumbCenter),
    TextDirection.rtl => (endThumbCenter, startThumbCenter),
  };
  final Size thumbSize = sliderTheme.rangeThumbShape!.getPreferredSize(
    isEnabled,
    isDiscrete,
  );
  final double thumbRadius = thumbSize.width / 2;
  assert(thumbRadius > 0);

  final Rect trackRect = getPreferredRect(
    parentBox: parentBox,
    offset: offset,
    sliderTheme: sliderTheme,
    isEnabled: isEnabled,
    isDiscrete: isDiscrete,
  );

  final Radius trackRadius = Radius.circular(trackRect.height / 2);

  context.canvas.drawRRect(
    RRect.fromLTRBAndCorners(
      trackRect.left,
      trackRect.top,
      leftThumbOffset.dx,
      trackRect.bottom,
      topLeft: trackRadius,
      bottomLeft: trackRadius,
    ),
    inactivePaint,
  );
  context.canvas.drawRRect(
    RRect.fromLTRBAndCorners(
      rightThumbOffset.dx,
      trackRect.top,
      trackRect.right,
      trackRect.bottom,
      topRight: trackRadius,
      bottomRight: trackRadius,
    ),
    inactivePaint,
  );
  context.canvas.drawRRect(
    RRect.fromLTRBR(
      leftThumbOffset.dx - (sliderTheme.trackHeight! / 2),
      trackRect.top - (additionalActiveTrackHeight / 2),
      rightThumbOffset.dx + (sliderTheme.trackHeight! / 2),
      trackRect.bottom + (additionalActiveTrackHeight / 2),
      trackRadius,
    ),
    activePaint,
  );
}