80 lines
2.2 KiB
Dart
80 lines
2.2 KiB
Dart
// 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<double> 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);
|
|
}
|
|
}
|