@@ -912,26 +912,69 @@ class _SwitchPainter extends ToggleablePainter {
912
912
? (currentValue < 0.5 ? onInactiveThumbImageError : onActiveThumbImageError)
913
913
: onInactiveThumbImageError;
914
914
915
- // Paint the track
916
915
final Paint paint = Paint ()
917
916
..color = trackColor;
918
- const double trackHorizontalPadding = kRadialReactionRadius - _kTrackRadius;
917
+
918
+ final Offset trackPaintOffset = _computeTrackPaintOffset (size, _kTrackWidth, _kTrackHeight);
919
+ final Offset thumbPaintOffset = _computeThumbPaintOffset (trackPaintOffset, visualPosition);
920
+ final Offset radialReactionOrigin = Offset (thumbPaintOffset.dx + _kThumbRadius, size.height / 2 );
921
+
922
+ _paintTrackWith (canvas, paint, trackPaintOffset);
923
+ paintRadialReaction (canvas: canvas, origin: radialReactionOrigin);
924
+ _paintThumbWith (
925
+ thumbPaintOffset,
926
+ canvas,
927
+ currentValue,
928
+ thumbColor,
929
+ thumbImage,
930
+ thumbErrorListener,
931
+ );
932
+ }
933
+
934
+ /// Computes canvas offset for track's upper left corner
935
+ Offset _computeTrackPaintOffset (Size canvasSize, double trackWidth, double trackHeight) {
936
+ final double horizontalOffset = (canvasSize.width - _kTrackWidth) / 2.0 ;
937
+ final double verticalOffset = (canvasSize.height - _kTrackHeight) / 2.0 ;
938
+
939
+ return Offset (horizontalOffset, verticalOffset);
940
+ }
941
+
942
+ /// Computes canvas offset for thumb's upper left corner as if it were a
943
+ /// square
944
+ Offset _computeThumbPaintOffset (Offset trackPaintOffset, double visualPosition) {
945
+ // How much thumb radius extends beyond the track
946
+ const double additionalThumbRadius = _kThumbRadius - _kTrackRadius;
947
+
948
+ final double horizontalProgress = visualPosition * trackInnerLength;
949
+ final double thumbHorizontalOffset = trackPaintOffset.dx - additionalThumbRadius + horizontalProgress;
950
+ final double thumbVerticalOffset = trackPaintOffset.dy - additionalThumbRadius;
951
+
952
+ return Offset (thumbHorizontalOffset, thumbVerticalOffset);
953
+ }
954
+
955
+ void _paintTrackWith (Canvas canvas, Paint paint, Offset trackPaintOffset) {
919
956
final Rect trackRect = Rect .fromLTWH (
920
- trackHorizontalPadding ,
921
- (size.height - _kTrackHeight) / 2.0 ,
922
- size.width - 2.0 * trackHorizontalPadding ,
957
+ trackPaintOffset.dx ,
958
+ trackPaintOffset.dy ,
959
+ _kTrackWidth ,
923
960
_kTrackHeight,
924
961
);
925
- final RRect trackRRect = RRect .fromRectAndRadius (trackRect, const Radius .circular (_kTrackRadius));
926
- canvas.drawRRect (trackRRect, paint);
927
-
928
- final Offset thumbPosition = Offset (
929
- kRadialReactionRadius + visualPosition * trackInnerLength,
930
- size.height / 2.0 ,
962
+ final RRect trackRRect = RRect .fromRectAndRadius (
963
+ trackRect,
964
+ const Radius .circular (_kTrackRadius),
931
965
);
932
966
933
- paintRadialReaction (canvas: canvas, origin: thumbPosition);
967
+ canvas.drawRRect (trackRRect, paint);
968
+ }
934
969
970
+ void _paintThumbWith (
971
+ Offset thumbPaintOffset,
972
+ Canvas canvas,
973
+ double currentValue,
974
+ Color thumbColor,
975
+ ImageProvider ? thumbImage,
976
+ ImageErrorListener ? thumbErrorListener,
977
+ ) {
935
978
try {
936
979
_isPainting = true ;
937
980
if (_cachedThumbPainter == null || thumbColor != _cachedThumbColor || thumbImage != _cachedThumbImage || thumbErrorListener != _cachedThumbErrorListener) {
@@ -946,9 +989,10 @@ class _SwitchPainter extends ToggleablePainter {
946
989
// The thumb contracts slightly during the animation
947
990
final double inset = 1.0 - (currentValue - 0.5 ).abs () * 2.0 ;
948
991
final double radius = _kThumbRadius - inset;
992
+
949
993
thumbPainter.paint (
950
994
canvas,
951
- thumbPosition - Offset (radius, radius ),
995
+ thumbPaintOffset + Offset (0 , inset ),
952
996
configuration.copyWith (size: Size .fromRadius (radius)),
953
997
);
954
998
} finally {
0 commit comments