// Author: fengshengxiong // Date: 2024/6/2 // Description: 自定义RoundedRectSliderTrackShape import 'package:flutter/material.dart'; class RoundRectSliderTrackShape extends SliderTrackShape { final double trackHeight; final double trackRadius; const RoundRectSliderTrackShape({ this.trackHeight = 4.0, this.trackRadius = 8.0, }); @override void paint(PaintingContext context, Offset offset, {required RenderBox parentBox, required SliderThemeData sliderTheme, required Animation enableAnimation, required Offset thumbCenter, Offset? secondaryOffset, bool isEnabled = false, bool isDiscrete = false, required TextDirection textDirection}) { if (sliderTheme.trackHeight == 0) return; final Rect trackRect = getPreferredRect( parentBox: parentBox, offset: offset, sliderTheme: sliderTheme, isEnabled: isEnabled, isDiscrete: isDiscrete, ); final Paint leftTrackPaint = Paint() ..color = sliderTheme.activeTrackColor! ..style = PaintingStyle.fill; final Paint rightTrackPaint = Paint() ..color = sliderTheme.inactiveTrackColor! ..style = PaintingStyle.fill; final RRect leftTrackSegment = RRect.fromLTRBR( trackRect.left, trackRect.top, thumbCenter.dx, trackRect.bottom, Radius.circular(trackRadius), ); final RRect rightTrackSegment = RRect.fromLTRBR( thumbCenter.dx, trackRect.top, trackRect.right, trackRect.bottom, Radius.circular(trackRadius), ); context.canvas.drawRRect(leftTrackSegment, leftTrackPaint); context.canvas.drawRRect(rightTrackSegment, rightTrackPaint); } @override Rect getPreferredRect({ required RenderBox parentBox, Offset offset = Offset.zero, required SliderThemeData sliderTheme, bool isEnabled = false, bool isDiscrete = false, }) { final double trackHeight = this.trackHeight; final double trackLeft = offset.dx; final double trackTop = offset.dy + (parentBox.size.height - trackHeight) / 2; final double trackWidth = parentBox.size.width; return Rect.fromLTWH(trackLeft, trackTop, trackWidth, trackHeight); } }