SliderTheme (
data: SliderTheme . of ( context) . copyWith (
trackHeight: 3 ,
trackShape: const GradientRectSliderTrackShape ( radius: 1.5 ) ,
thumbShape: const GradientSliderComponentShape (
rectWH: 14 , overlayRectSpace: 4 , overlayColor: Colours . black) ,
) ,
child: Slider (
value: 3 ,
inactiveColor: Color ( 0x55FFFFFF ) ,
min: 1 ,
max: 10 ,
) ,
)
import 'package:flutter/material.dart' ;
class GradientRectSliderTrackShape extends SliderTrackShape
with BaseSliderTrackShape {
final double disabledThumbGapWidth;
final double radius;
final LinearGradient gradient;
const GradientRectSliderTrackShape (
{ this . disabledThumbGapWidth = 2.0 ,
this . radius = 0 ,
this . gradient = const LinearGradient (
colors: [ Color ( 0xFFA2FFB7 ) , Color ( 0xFF00FAED ) ] ) } ) ;
@override
Rect getPreferredRect ( {
required RenderBox parentBox,
Offset offset = Offset . zero,
required SliderThemeData sliderTheme,
bool isEnabled = false ,
bool isDiscrete = false ,
} ) {
final double overlayWidth =
sliderTheme. overlayShape! . getPreferredSize ( isEnabled, isDiscrete) . width;
final double trackHeight = sliderTheme. trackHeight ? ? 2 ;
assert ( overlayWidth >= 0 ) ;
assert ( trackHeight >= 0 ) ;
assert ( parentBox. size. width >= overlayWidth) ;
assert ( parentBox. size. height >= trackHeight) ;
final double trackLeft = offset. dx + overlayWidth / 2 ;
final double trackTop =
offset. dy + ( parentBox. size. height - trackHeight) / 2 ;
final double trackWidth = parentBox. size. width - overlayWidth;
return Rect . fromLTWH ( trackLeft, trackTop, trackWidth, trackHeight) ;
}
@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,
} ) {
assert ( sliderTheme. disabledActiveTrackColor != null ) ;
assert ( sliderTheme. disabledInactiveTrackColor != null ) ;
assert ( sliderTheme. activeTrackColor != null ) ;
assert ( sliderTheme. inactiveTrackColor != null ) ;
assert ( sliderTheme. thumbShape != null ) ;
if ( sliderTheme. trackHeight! <= 0 ) {
return ;
}
final Rect trackRect = getPreferredRect (
parentBox: parentBox,
offset: offset,
sliderTheme: sliderTheme,
isEnabled: isEnabled,
isDiscrete: isDiscrete,
) ;
final ColorTween activeTrackColorTween = ColorTween (
begin: sliderTheme. disabledActiveTrackColor,
end: sliderTheme. activeTrackColor) ;
final ColorTween inactiveTrackColorTween = ColorTween (
begin: sliderTheme. disabledInactiveTrackColor,
end: sliderTheme. inactiveTrackColor) ;
final Paint activePaint = Paint ( )
. . shader = gradient. createShader ( trackRect)
. . color = activeTrackColorTween. evaluate ( enableAnimation) ! ;
final Paint inactivePaint = Paint ( )
. . color = inactiveTrackColorTween. evaluate ( enableAnimation) ! ;
final Paint leftTrackPaint;
final Paint rightTrackPaint;
switch ( textDirection) {
case TextDirection . ltr:
leftTrackPaint = activePaint;
rightTrackPaint = inactivePaint;
break ;
case TextDirection . rtl:
leftTrackPaint = inactivePaint;
rightTrackPaint = activePaint;
break ;
}
double horizontalAdjustment = 0.0 ;
if ( ! isEnabled) {
final double disabledThumbRadius =
sliderTheme. thumbShape! . getPreferredSize ( false , isDiscrete) . width /
2.0 ;
final double gap = disabledThumbGapWidth * ( 1.0 - enableAnimation. value) ;
horizontalAdjustment = disabledThumbRadius + gap;
}
final RRect leftTrackSegment = RRect . fromLTRBR (
trackRect. left,
trackRect. top,
thumbCenter. dx - horizontalAdjustment,
trackRect. bottom,
Radius . circular ( radius) ) ;
context. canvas. drawRRect ( leftTrackSegment, leftTrackPaint) ;
final RRect rightTrackSegment = RRect . fromLTRBR (
thumbCenter. dx + horizontalAdjustment,
trackRect. top,
trackRect. right,
trackRect. bottom,
Radius . circular ( radius) ) ;
context. canvas. drawRRect ( rightTrackSegment, rightTrackPaint) ;
}
}
import 'package:flutter/material.dart' ;
class GradientSliderComponentShape extends SliderComponentShape {
final double rectWH;
final double overlayRectSpace;
final LinearGradient thumbGradient;
final Color ? overlayColor;
const GradientSliderComponentShape (
{ required this . rectWH,
required this . overlayRectSpace,
this . thumbGradient =
const LinearGradient ( colors: [ Color ( 0xFFA2FFB7 ) , Color ( 0xFF00FAED ) ] ) ,
this . overlayColor} ) ;
@override
Size getPreferredSize ( bool isEnabled, bool isDiscrete) {
return const Size ( 0 , 0 ) ;
}
@override
void paint ( PaintingContext context, Offset center,
{ required Animation < double> activationAnimation,
required Animation < double> enableAnimation,
required bool isDiscrete,
required TextPainter labelPainter,
required RenderBox parentBox,
required SliderThemeData sliderTheme,
required TextDirection textDirection,
required double value,
required double textScaleFactor,
required Size sizeWithOverflow} ) {
final Canvas canvas = context. canvas;
double overlayWH = rectWH + overlayRectSpace;
canvas. drawRRect (
RRect . fromRectAndRadius (
Rect . fromCenter ( center: center, width: overlayWH, height: overlayWH) ,
Radius . circular ( overlayWH / 2 ) ,
) ,
Paint ( )
. . color = ( overlayColor != null )
? overlayColor!
: const Color . fromARGB ( 255 , 252 , 241 , 216 ) ,
) ;
canvas. drawRRect (
RRect . fromRectAndRadius (
Rect . fromCenter ( center: center, width: rectWH, height: rectWH) ,
Radius . circular ( rectWH / 2 ) ,
) ,
Paint ( )
. . shader = thumbGradient. createShader (
Rect . fromCenter ( center: center, width: rectWH, height: rectWH) ) ) ;
}
}