diff --git a/examples/flutter_gallery/lib/demo/material/slider_demo.dart b/examples/flutter_gallery/lib/demo/material/slider_demo.dart
index aae6417..3ba93ec 100644
--- a/examples/flutter_gallery/lib/demo/material/slider_demo.dart
+++ b/examples/flutter_gallery/lib/demo/material/slider_demo.dart
@@ -69,7 +69,6 @@
     @required SliderThemeData sliderTheme,
     TextDirection textDirection,
     Thumb thumb,
-    bool isPressed,
   }) {
     final Canvas canvas = context.canvas;
     final ColorTween colorTween = ColorTween(
@@ -131,8 +130,6 @@
     SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     final Canvas canvas = context.canvas;
     final ColorTween colorTween = ColorTween(
@@ -172,8 +169,6 @@
     SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     final Canvas canvas = context.canvas;
     final ColorTween enableColor = ColorTween(
@@ -443,3 +438,4 @@
     );
   }
 }
+
diff --git a/examples/flutter_gallery/lib/gallery/themes.dart b/examples/flutter_gallery/lib/gallery/themes.dart
index 3e66950..7843012 100644
--- a/examples/flutter_gallery/lib/gallery/themes.dart
+++ b/examples/flutter_gallery/lib/gallery/themes.dart
@@ -25,7 +25,6 @@
   final ThemeData base = ThemeData(
     brightness: Brightness.dark,
     accentColorBrightness: Brightness.dark,
-    colorScheme: colorScheme,
     primaryColor: primaryColor,
     primaryColorDark: const Color(0xFF0050a0),
     primaryColorLight: secondaryColor,
diff --git a/examples/flutter_gallery/pubspec.yaml b/examples/flutter_gallery/pubspec.yaml
index 94a3801..a16a272 100644
--- a/examples/flutter_gallery/pubspec.yaml
+++ b/examples/flutter_gallery/pubspec.yaml
@@ -257,31 +257,31 @@
           weight: 400
     - family: LibreFranklin
       fonts:
-        - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Bold.ttf
-        - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Light.ttf
-        - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Medium.ttf
-        - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Regular.ttf
+      - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Bold.ttf
+      - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Light.ttf
+      - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Medium.ttf
+      - asset: packages/flutter_gallery_assets/fonts/librefranklin/LibreFranklin-Regular.ttf
     - family: Merriweather
       fonts:
-        - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-BlackItalic.ttf
-        - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Italic.ttf
-        - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
-        - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
+      - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-BlackItalic.ttf
+      - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Italic.ttf
+      - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Regular.ttf
+      - asset: packages/flutter_gallery_assets/fonts/merriweather/Merriweather-Light.ttf
     - family: Roboto Condensed
       fonts:
-        - asset: packages/rally_assets/RobotoCondensed-Light.ttf
-          weight: 400
-        - asset: packages/rally_assets/RobotoCondensed-Regular.ttf
-          weight: 500
-        - asset: packages/rally_assets/RobotoCondensed-Bold.ttf
-          weight: 700
+      - asset: packages/rally_assets/RobotoCondensed-Light.ttf
+        weight: 400
+      - asset: packages/rally_assets/RobotoCondensed-Regular.ttf
+        weight: 500
+      - asset: packages/rally_assets/RobotoCondensed-Bold.ttf
+        weight: 700
     - family: Eczar
       fonts:
-        - asset: packages/rally_assets/Eczar-Regular.ttf
-          weight: 400
-        - asset: packages/rally_assets/Eczar-SemiBold.ttf
-          weight: 600
-        - asset: packages/rally_assets/Eczar-Bold.ttf
-          weight: 700
+      - asset: packages/rally_assets/Eczar-Regular.ttf
+        weight: 400
+      - asset: packages/rally_assets/Eczar-SemiBold.ttf
+        weight: 600
+      - asset: packages/rally_assets/Eczar-Bold.ttf
+        weight: 700
 
-# PUBSPEC CHECKSUM: de7e
\ No newline at end of file
+# PUBSPEC CHECKSUM: de7e
diff --git a/packages/flutter/lib/src/material/range_slider.dart b/packages/flutter/lib/src/material/range_slider.dart
index 9905277..565a108 100644
--- a/packages/flutter/lib/src/material/range_slider.dart
+++ b/packages/flutter/lib/src/material/range_slider.dart
@@ -519,12 +519,12 @@
     return null;
   };
 
-  static const double _defaultTrackHeight = 4;
+  static const double _defaultTrackHeight = 2;
   static const RangeSliderTrackShape _defaultTrackShape = RoundedRectRangeSliderTrackShape();
   static const RangeSliderTickMarkShape _defaultTickMarkShape = RoundRangeSliderTickMarkShape();
   static const SliderComponentShape _defaultOverlayShape = RoundSliderOverlayShape();
   static const RangeSliderThumbShape _defaultThumbShape = RoundRangeSliderThumbShape();
-  static const RangeSliderValueIndicatorShape _defaultValueIndicatorShape = RectangularRangeSliderValueIndicatorShape();
+  static const RangeSliderValueIndicatorShape _defaultValueIndicatorShape = PaddleRangeSliderValueIndicatorShape();
   static const ShowValueIndicator _defaultShowValueIndicator = ShowValueIndicator.onlyForDiscrete;
   static const double _defaultMinThumbSeparation = 8;
 
@@ -542,19 +542,6 @@
     // colors come from the ThemeData.colorScheme. These colors, along with
     // the default shapes and text styles are aligned to the Material
     // Guidelines.
-
-    // The value indicator color is not the same as the thumb and active track
-    // (which can be defined by activeColor) if the
-    // RectangularSliderValueIndicatorShape is used. In all other cases, the
-    // value indicator is assumed to be the same as the active color.
-    final RangeSliderValueIndicatorShape valueIndicatorShape = sliderTheme.rangeValueIndicatorShape ?? _defaultValueIndicatorShape;
-    Color valueIndicatorColor;
-    if (valueIndicatorShape is RectangularRangeSliderValueIndicatorShape) {
-      valueIndicatorColor = sliderTheme.valueIndicatorColor ?? Color.alphaBlend(theme.colorScheme.onSurface.withOpacity(0.60), theme.colorScheme.surface.withOpacity(0.90));
-    } else {
-      valueIndicatorColor = widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary;
-    }
-
     sliderTheme = sliderTheme.copyWith(
       trackHeight: sliderTheme.trackHeight ?? _defaultTrackHeight,
       activeTrackColor: widget.activeColor ?? sliderTheme.activeTrackColor ?? theme.colorScheme.primary,
@@ -569,13 +556,12 @@
       overlappingShapeStrokeColor: sliderTheme.overlappingShapeStrokeColor ?? theme.colorScheme.surface,
       disabledThumbColor: sliderTheme.disabledThumbColor ?? theme.colorScheme.onSurface.withOpacity(0.38),
       overlayColor: widget.activeColor?.withOpacity(0.12) ?? sliderTheme.overlayColor ?? theme.colorScheme.primary.withOpacity(0.12),
-      valueIndicatorColor: valueIndicatorColor,
-      surfaceColor: sliderTheme.surfaceColor ?? theme.colorScheme.surface,
+      valueIndicatorColor: widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary,
       rangeTrackShape: sliderTheme.rangeTrackShape ?? _defaultTrackShape,
       rangeTickMarkShape: sliderTheme.rangeTickMarkShape ?? _defaultTickMarkShape,
       rangeThumbShape: sliderTheme.rangeThumbShape ?? _defaultThumbShape,
       overlayShape: sliderTheme.overlayShape ?? _defaultOverlayShape,
-      rangeValueIndicatorShape: valueIndicatorShape,
+      rangeValueIndicatorShape: sliderTheme.rangeValueIndicatorShape ?? _defaultValueIndicatorShape,
       showValueIndicator: sliderTheme.showValueIndicator ?? _defaultShowValueIndicator,
       valueIndicatorTextStyle: sliderTheme.valueIndicatorTextStyle ?? theme.textTheme.body2.copyWith(
         color: theme.colorScheme.onPrimary,
@@ -584,18 +570,12 @@
       thumbSelector: sliderTheme.thumbSelector ?? _defaultRangeThumbSelector,
     );
 
-    // This size is used as the max bounds for the painting of the value
-    // indicators It must be kept in sync with the function with the same name
-    // in slider.dart.
-    Size _sizeWithOverflow() => MediaQuery.of(context).size;
-
     return _RangeSliderRenderObjectWidget(
       values: _unlerpRangeValues(widget.values),
       divisions: widget.divisions,
       labels: widget.labels,
       sliderTheme: sliderTheme,
       textScaleFactor: MediaQuery.of(context).textScaleFactor,
-      sizeWithOverflow: _sizeWithOverflow(),
       onChanged: (widget.onChanged != null) && (widget.max > widget.min) ? _handleChanged : null,
       onChangeStart: widget.onChangeStart != null ? _handleDragStart : null,
       onChangeEnd: widget.onChangeEnd != null ? _handleDragEnd : null,
@@ -613,7 +593,6 @@
     this.labels,
     this.sliderTheme,
     this.textScaleFactor,
-    this.sizeWithOverflow,
     this.onChanged,
     this.onChangeStart,
     this.onChangeEnd,
@@ -626,7 +605,6 @@
   final RangeLabels labels;
   final SliderThemeData sliderTheme;
   final double textScaleFactor;
-  final Size sizeWithOverflow;
   final ValueChanged<RangeValues> onChanged;
   final ValueChanged<RangeValues> onChangeStart;
   final ValueChanged<RangeValues> onChangeEnd;
@@ -642,7 +620,6 @@
       sliderTheme: sliderTheme,
       theme: Theme.of(context),
       textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
       onChanged: onChanged,
       onChangeStart: onChangeStart,
       onChangeEnd: onChangeEnd,
@@ -662,7 +639,6 @@
       ..sliderTheme = sliderTheme
       ..theme = Theme.of(context)
       ..textScaleFactor = textScaleFactor
-      ..sizeWithOverflow = sizeWithOverflow
       ..onChanged = onChanged
       ..onChangeStart = onChangeStart
       ..onChangeEnd = onChangeEnd
@@ -680,7 +656,6 @@
     SliderThemeData sliderTheme,
     ThemeData theme,
     double textScaleFactor,
-    Size sizeWithOverflow,
     TargetPlatform platform,
     ValueChanged<RangeValues> onChanged,
     RangeSemanticFormatterCallback semanticFormatterCallback,
@@ -701,7 +676,6 @@
         _sliderTheme = sliderTheme,
         _theme = theme,
         _textScaleFactor = textScaleFactor,
-        _sizeWithOverflow = sizeWithOverflow,
         _onChanged = onChanged,
         _state = state,
         _textDirection = textDirection {
@@ -874,15 +848,6 @@
     _updateLabelPainters();
   }
 
-  Size get sizeWithOverflow => _sizeWithOverflow;
-  Size _sizeWithOverflow;
-  set sizeWithOverflow(Size value) {
-    if (value == sizeWithOverflow)
-      return;
-    _sizeWithOverflow = value;
-    markNeedsPaint();
-  }
-
   ValueChanged<RangeValues> get onChanged => _onChanged;
   ValueChanged<RangeValues> _onChanged;
   set onChanged(ValueChanged<RangeValues> value) {
@@ -1230,11 +1195,8 @@
         isEnabled: isEnabled,
     );
 
-    final bool startThumbSelected = _lastThumbSelection == Thumb.start;
-    final bool endThumbSelected = _lastThumbSelection == Thumb.end;
-
     if (!_overlayAnimation.isDismissed) {
-      if (startThumbSelected) {
+      if (_lastThumbSelection == Thumb.start) {
         _sliderTheme.overlayShape.paint(
           context,
           startThumbCenter,
@@ -1248,7 +1210,7 @@
           value: startValue,
         );
       }
-      if (endThumbSelected) {
+      if (_lastThumbSelection == Thumb.end) {
         _sliderTheme.overlayShape.paint(
           context,
           endThumbCenter,
@@ -1269,7 +1231,7 @@
         isEnabled: isEnabled,
         sliderTheme: _sliderTheme,
       ).width;
-      final double adjustedTrackWidth = trackRect.width - trackRect.height;
+      final double adjustedTrackWidth = trackRect.width - tickMarkWidth;
       // If the tick marks would be too dense, don't bother painting them.
       if (adjustedTrackWidth / divisions >= 3.0 * tickMarkWidth) {
         final double dy = trackRect.center.dy;
@@ -1277,7 +1239,7 @@
           final double value = i / divisions;
           // The ticks are mapped to be within the track, so the tick mark width
           // must be subtracted from the track width.
-          final double dx = trackRect.left + value * adjustedTrackWidth + trackRect.height / 2;
+          final double dx = trackRect.left + value * adjustedTrackWidth + tickMarkWidth / 2;
           final Offset tickMarkOffset = Offset(dx, dy);
           _sliderTheme.rangeTickMarkShape.paint(
             context,
@@ -1306,7 +1268,6 @@
     final double bottomValue = isLastThumbStart ? endValue : startValue;
     final double topValue = isLastThumbStart ? startValue : endValue;
     final bool shouldPaintValueIndicators = isEnabled && labels != null && !_valueIndicatorAnimation.isDismissed && showValueIndicator;
-    final Size resolvedSizeWithOverflow = sizeWithOverflow.isEmpty ? size : sizeWithOverflow;
 
     if (shouldPaintValueIndicators) {
       _sliderTheme.rangeValueIndicatorShape.paint(
@@ -1322,8 +1283,6 @@
         textDirection: _textDirection,
         thumb: bottomThumb,
         value: bottomValue,
-        textScaleFactor: textScaleFactor,
-        sizeWithOverflow: resolvedSizeWithOverflow,
       );
     }
 
@@ -1337,7 +1296,6 @@
       textDirection: textDirection,
       sliderTheme: _sliderTheme,
       thumb: bottomThumb,
-      isPressed: bottomThumb == Thumb.start ? startThumbSelected : endThumbSelected,
     );
 
     if (shouldPaintValueIndicators) {
@@ -1346,29 +1304,15 @@
         center: startThumbCenter,
         labelPainter: _startLabelPainter,
         activationAnimation: _valueIndicatorAnimation,
-        textScaleFactor: textScaleFactor,
-        sizeWithOverflow: resolvedSizeWithOverflow,
       );
       final double endOffset = sliderTheme.rangeValueIndicatorShape.getHorizontalShift(
         parentBox: this,
         center: endThumbCenter,
         labelPainter: _endLabelPainter,
         activationAnimation: _valueIndicatorAnimation,
-        textScaleFactor: textScaleFactor,
-        sizeWithOverflow: resolvedSizeWithOverflow,
       );
-      final double startHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(
-        isEnabled,
-        isDiscrete,
-        labelPainter: _startLabelPainter,
-        textScaleFactor: textScaleFactor,
-      ).width / 2;
-      final double endHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(
-        isEnabled,
-        isDiscrete,
-        labelPainter: _endLabelPainter,
-        textScaleFactor: textScaleFactor,
-      ).width / 2;
+      final double startHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(isEnabled, isDiscrete, labelPainter: _startLabelPainter).width / 2;
+      final double endHalfWidth = sliderTheme.rangeValueIndicatorShape.getPreferredSize(isEnabled, isDiscrete, labelPainter: _endLabelPainter).width / 2;
       double innerOverflow = startHalfWidth + endHalfWidth;
       switch (textDirection) {
         case TextDirection.ltr:
@@ -1394,22 +1338,19 @@
         textDirection: _textDirection,
         thumb: topThumb,
         value: topValue,
-        textScaleFactor: textScaleFactor,
-        sizeWithOverflow: resolvedSizeWithOverflow,
       );
     }
 
     _sliderTheme.rangeThumbShape.paint(
       context,
       topThumbCenter,
-      activationAnimation: _overlayAnimation,
+      activationAnimation: _valueIndicatorAnimation,
       enableAnimation: _enableAnimation,
       isDiscrete: isDiscrete,
       isOnTop: thumbDelta < sliderTheme.rangeThumbShape.getPreferredSize(isEnabled, isDiscrete).width,
       textDirection: textDirection,
       sliderTheme: _sliderTheme,
       thumb: topThumb,
-      isPressed: topThumb == Thumb.start ? startThumbSelected : endThumbSelected,
     );
   }
 
diff --git a/packages/flutter/lib/src/material/slider.dart b/packages/flutter/lib/src/material/slider.dart
index 25db847..025b688 100644
--- a/packages/flutter/lib/src/material/slider.dart
+++ b/packages/flutter/lib/src/material/slider.dart
@@ -477,12 +477,12 @@
     return widget.max > widget.min ? (value - widget.min) / (widget.max - widget.min) : 0.0;
   }
 
-  static const double _defaultTrackHeight = 4;
+  static const double _defaultTrackHeight = 2;
   static const SliderTrackShape _defaultTrackShape = RoundedRectSliderTrackShape();
   static const SliderTickMarkShape _defaultTickMarkShape = RoundSliderTickMarkShape();
   static const SliderComponentShape _defaultOverlayShape = RoundSliderOverlayShape();
   static const SliderComponentShape _defaultThumbShape = RoundSliderThumbShape();
-  static const SliderComponentShape _defaultValueIndicatorShape = RectangularSliderValueIndicatorShape();
+  static const SliderComponentShape _defaultValueIndicatorShape = PaddleSliderValueIndicatorShape();
   static const ShowValueIndicator _defaultShowValueIndicator = ShowValueIndicator.onlyForDiscrete;
 
   @override
@@ -520,19 +520,6 @@
     // colors come from the ThemeData.colorScheme. These colors, along with
     // the default shapes and text styles are aligned to the Material
     // Guidelines.
-
-    // The value indicator color is not the same as the thumb and active track
-    // (which can be defined by activeColor) if the
-    // RectangularSliderValueIndicatorShape is used. In all other cases, the
-    // value indicator is assumed to be the same as the active color.
-    final SliderComponentShape valueIndicatorShape = sliderTheme.valueIndicatorShape ?? _defaultValueIndicatorShape;
-    Color valueIndicatorColor;
-    if (valueIndicatorShape is RectangularSliderValueIndicatorShape) {
-      valueIndicatorColor = sliderTheme.valueIndicatorColor ?? Color.alphaBlend(theme.colorScheme.onSurface.withOpacity(0.60), theme.colorScheme.surface.withOpacity(0.90));
-    } else {
-      valueIndicatorColor = widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary;
-    }
-
     sliderTheme = sliderTheme.copyWith(
       trackHeight: sliderTheme.trackHeight ?? _defaultTrackHeight,
       activeTrackColor: widget.activeColor ?? sliderTheme.activeTrackColor ?? theme.colorScheme.primary,
@@ -546,31 +533,24 @@
       thumbColor: widget.activeColor ?? sliderTheme.thumbColor ?? theme.colorScheme.primary,
       disabledThumbColor: sliderTheme.disabledThumbColor ?? theme.colorScheme.onSurface.withOpacity(0.38),
       overlayColor: widget.activeColor?.withOpacity(0.12) ?? sliderTheme.overlayColor ?? theme.colorScheme.primary.withOpacity(0.12),
-      valueIndicatorColor: valueIndicatorColor,
-      surfaceColor: sliderTheme.surfaceColor ?? theme.colorScheme.surface,
+      valueIndicatorColor: widget.activeColor ?? sliderTheme.valueIndicatorColor ?? theme.colorScheme.primary,
       trackShape: sliderTheme.trackShape ?? _defaultTrackShape,
       tickMarkShape: sliderTheme.tickMarkShape ?? _defaultTickMarkShape,
       thumbShape: sliderTheme.thumbShape ?? _defaultThumbShape,
       overlayShape: sliderTheme.overlayShape ?? _defaultOverlayShape,
-      valueIndicatorShape: valueIndicatorShape,
+      valueIndicatorShape: sliderTheme.valueIndicatorShape ?? _defaultValueIndicatorShape,
       showValueIndicator: sliderTheme.showValueIndicator ?? _defaultShowValueIndicator,
       valueIndicatorTextStyle: sliderTheme.valueIndicatorTextStyle ?? theme.textTheme.body2.copyWith(
         color: theme.colorScheme.onPrimary,
       ),
     );
 
-    // This size is used as the max bounds for the painting of the value
-    // indicators It must be kept in sync with the function with the same name
-    // in range_slider.dart.
-    Size _sizeWithOverflow() => MediaQuery.of(context).size;
-
     return _SliderRenderObjectWidget(
       value: _unlerp(widget.value),
       divisions: widget.divisions,
       label: widget.label,
       sliderTheme: sliderTheme,
-      textScaleFactor: MediaQuery.of(context).textScaleFactor,
-      sizeWithOverflow: _sizeWithOverflow(),
+      mediaQueryData: MediaQuery.of(context),
       onChanged: (widget.onChanged != null) && (widget.max > widget.min) ? _handleChanged : null,
       onChangeStart: widget.onChangeStart != null ? _handleDragStart : null,
       onChangeEnd: widget.onChangeEnd != null ? _handleDragEnd : null,
@@ -606,8 +586,7 @@
     this.divisions,
     this.label,
     this.sliderTheme,
-    this.textScaleFactor,
-    this.sizeWithOverflow,
+    this.mediaQueryData,
     this.onChanged,
     this.onChangeStart,
     this.onChangeEnd,
@@ -619,8 +598,7 @@
   final int divisions;
   final String label;
   final SliderThemeData sliderTheme;
-  final double textScaleFactor;
-  final Size sizeWithOverflow;
+  final MediaQueryData mediaQueryData;
   final ValueChanged<double> onChanged;
   final ValueChanged<double> onChangeStart;
   final ValueChanged<double> onChangeEnd;
@@ -634,8 +612,7 @@
       divisions: divisions,
       label: label,
       sliderTheme: sliderTheme,
-      textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
+      mediaQueryData: mediaQueryData,
       onChanged: onChanged,
       onChangeStart: onChangeStart,
       onChangeEnd: onChangeEnd,
@@ -654,8 +631,7 @@
       ..label = label
       ..sliderTheme = sliderTheme
       ..theme = Theme.of(context)
-      ..textScaleFactor = textScaleFactor
-      ..sizeWithOverflow = sizeWithOverflow
+      ..mediaQueryData = mediaQueryData
       ..onChanged = onChanged
       ..onChangeStart = onChangeStart
       ..onChangeEnd = onChangeEnd
@@ -673,8 +649,7 @@
     int divisions,
     String label,
     SliderThemeData sliderTheme,
-    double textScaleFactor,
-    Size sizeWithOverflow,
+    MediaQueryData mediaQueryData,
     TargetPlatform platform,
     ValueChanged<double> onChanged,
     SemanticFormatterCallback semanticFormatterCallback,
@@ -691,8 +666,7 @@
        _value = value,
        _divisions = divisions,
        _sliderTheme = sliderTheme,
-       _textScaleFactor = textScaleFactor,
-       _sizeWithOverflow = sizeWithOverflow,
+       _mediaQueryData = mediaQueryData,
        _onChanged = onChanged,
        _state = state,
        _textDirection = textDirection {
@@ -847,28 +821,18 @@
     markNeedsPaint();
   }
 
-  double get textScaleFactor => _textScaleFactor;
-  double _textScaleFactor;
-  set textScaleFactor(double value) {
-    if (value == _textScaleFactor) {
+  MediaQueryData get mediaQueryData => _mediaQueryData;
+  MediaQueryData _mediaQueryData;
+  set mediaQueryData(MediaQueryData value) {
+    if (value == _mediaQueryData) {
       return;
     }
-    _textScaleFactor = value;
+    _mediaQueryData = value;
     // Media query data includes the textScaleFactor, so we need to update the
     // label painter.
     _updateLabelPainter();
   }
 
-  Size get sizeWithOverflow => _sizeWithOverflow;
-  Size _sizeWithOverflow;
-  set sizeWithOverflow(Size value) {
-    if (value == _sizeWithOverflow) {
-      return;
-    }
-    _sizeWithOverflow = value;
-    markNeedsPaint();
-  }
-
   ValueChanged<double> get onChanged => _onChanged;
   ValueChanged<double> _onChanged;
   set onChanged(ValueChanged<double> value) {
@@ -942,7 +906,7 @@
           text: label,
         )
         ..textDirection = textDirection
-        ..textScaleFactor = textScaleFactor
+        ..textScaleFactor = _mediaQueryData.textScaleFactor
         ..layout();
     } else {
       _labelPainter.text = null;
@@ -1123,8 +1087,7 @@
       sliderTheme: _sliderTheme,
       isDiscrete: isDiscrete,
     );
-    final Offset thumbCenter = Offset(
-        trackRect.left + visualPosition * trackRect.width, trackRect.center.dy);
+    final Offset thumbCenter = Offset(trackRect.left + visualPosition * trackRect.width, trackRect.center.dy);
 
     _sliderTheme.trackShape.paint(
       context,
@@ -1158,7 +1121,7 @@
         isEnabled: isInteractive,
         sliderTheme: _sliderTheme,
       ).width;
-      final double adjustedTrackWidth = trackRect.width - trackRect.height;
+      final double adjustedTrackWidth = trackRect.width - tickMarkWidth;
       // If the tick marks would be too dense, don't bother painting them.
       if (adjustedTrackWidth / divisions >= 3.0 * tickMarkWidth) {
         final double dy = trackRect.center.dy;
@@ -1166,7 +1129,7 @@
           final double value = i / divisions;
           // The ticks are mapped to be within the track, so the tick mark width
           // must be subtracted from the track width.
-          final double dx = trackRect.left + value * adjustedTrackWidth + trackRect.height / 2;
+          final double dx = trackRect.left + value * adjustedTrackWidth + tickMarkWidth / 2;
           final Offset tickMarkOffset = Offset(dx, dy);
           _sliderTheme.tickMarkShape.paint(
             context,
@@ -1195,8 +1158,6 @@
           sliderTheme: _sliderTheme,
           textDirection: _textDirection,
           value: _value,
-          textScaleFactor: textScaleFactor,
-          sizeWithOverflow: sizeWithOverflow.isEmpty ? size : sizeWithOverflow,
         );
       }
     }
@@ -1204,14 +1165,13 @@
     _sliderTheme.thumbShape.paint(
       context,
       thumbCenter,
-      activationAnimation: _overlayAnimation,
+      activationAnimation: _valueIndicatorAnimation,
       enableAnimation: _enableAnimation,
       isDiscrete: isDiscrete,
       labelPainter: _labelPainter,
       parentBox: this,
       sliderTheme: _sliderTheme,
       textDirection: _textDirection,
-      sizeWithOverflow: sizeWithOverflow.isEmpty ? size : sizeWithOverflow,
       value: _value,
     );
   }
diff --git a/packages/flutter/lib/src/material/slider_theme.dart b/packages/flutter/lib/src/material/slider_theme.dart
index a0a7d24..52282c1 100644
--- a/packages/flutter/lib/src/material/slider_theme.dart
+++ b/packages/flutter/lib/src/material/slider_theme.dart
@@ -278,7 +278,7 @@
 /// by creating subclasses of [SliderTrackShape],
 /// [SliderComponentShape], and/or [SliderTickMarkShape]. See
 /// [RoundSliderThumbShape], [RectangularSliderTrackShape],
-/// [RoundSliderTickMarkShape], [RectangularSliderValueIndicatorShape], and
+/// [RoundSliderTickMarkShape], [PaddleSliderValueIndicatorShape], and
 /// [RoundSliderOverlayShape] for examples.
 ///
 /// The track painting can be skipped by specifying 0 for [trackHeight].
@@ -355,7 +355,6 @@
     this.disabledThumbColor,
     this.overlayColor,
     this.valueIndicatorColor,
-    this.surfaceColor,
     this.overlayShape,
     this.tickMarkShape,
     this.thumbShape,
@@ -491,14 +490,6 @@
   /// The color given to the [valueIndicatorShape] to draw itself with.
   final Color valueIndicatorColor;
 
-  /// The surface color that the slider is resting on.
-  ///
-  /// This is used to clear painting regions for possibly transparent thumbs and
-  /// thumb shadows.
-  ///
-  /// Defaults to [ColorScheme.surface].
-  final Color surfaceColor;
-
   /// The shape that will be used to draw the [Slider]'s overlay.
   ///
   /// Both the [overlayColor] and a non default [overlayShape] may be specified.
@@ -665,7 +656,6 @@
     Color disabledThumbColor,
     Color overlayColor,
     Color valueIndicatorColor,
-    Color surfaceColor,
     SliderComponentShape overlayShape,
     SliderTickMarkShape tickMarkShape,
     SliderComponentShape thumbShape,
@@ -695,7 +685,6 @@
       disabledThumbColor: disabledThumbColor ?? this.disabledThumbColor,
       overlayColor: overlayColor ?? this.overlayColor,
       valueIndicatorColor: valueIndicatorColor ?? this.valueIndicatorColor,
-      surfaceColor: surfaceColor ?? this.surfaceColor,
       overlayShape: overlayShape ?? this.overlayShape,
       tickMarkShape: tickMarkShape ?? this.tickMarkShape,
       thumbShape: thumbShape ?? this.thumbShape,
@@ -736,7 +725,6 @@
       disabledThumbColor: Color.lerp(a.disabledThumbColor, b.disabledThumbColor, t),
       overlayColor: Color.lerp(a.overlayColor, b.overlayColor, t),
       valueIndicatorColor: Color.lerp(a.valueIndicatorColor, b.valueIndicatorColor, t),
-      surfaceColor: Color.lerp(a.surfaceColor, b.surfaceColor, t),
       overlayShape: t < 0.5 ? a.overlayShape : b.overlayShape,
       tickMarkShape: t < 0.5 ? a.tickMarkShape : b.tickMarkShape,
       thumbShape: t < 0.5 ? a.thumbShape : b.thumbShape,
@@ -770,7 +758,6 @@
       disabledThumbColor,
       overlayColor,
       valueIndicatorColor,
-      surfaceColor,
       overlayShape,
       tickMarkShape,
       thumbShape,
@@ -810,7 +797,6 @@
       && otherData.disabledThumbColor == disabledThumbColor
       && otherData.overlayColor == overlayColor
       && otherData.valueIndicatorColor == valueIndicatorColor
-      && otherData.surfaceColor == surfaceColor
       && otherData.overlayShape == overlayShape
       && otherData.tickMarkShape == tickMarkShape
       && otherData.thumbShape == thumbShape
@@ -844,7 +830,6 @@
     properties.add(ColorProperty('disabledThumbColor', disabledThumbColor, defaultValue: defaultData.disabledThumbColor));
     properties.add(ColorProperty('overlayColor', overlayColor, defaultValue: defaultData.overlayColor));
     properties.add(ColorProperty('valueIndicatorColor', valueIndicatorColor, defaultValue: defaultData.valueIndicatorColor));
-    properties.add(ColorProperty('surfaceColor', surfaceColor, defaultValue: defaultData.surfaceColor));
     properties.add(DiagnosticsProperty<SliderComponentShape>('overlayShape', overlayShape, defaultValue: defaultData.overlayShape));
     properties.add(DiagnosticsProperty<SliderTickMarkShape>('tickMarkShape', tickMarkShape, defaultValue: defaultData.tickMarkShape));
     properties.add(DiagnosticsProperty<SliderComponentShape>('thumbShape', thumbShape, defaultValue: defaultData.thumbShape));
@@ -993,16 +978,6 @@
   /// [labelPainter] already has the [textDirection] set.
   ///
   /// [value] is the current parametric value (from 0.0 to 1.0) of the slider.
-  ///
-  /// [textScaleFactor] can be used to determine whether the component should
-  /// paint larger or smaller, depending on whether [textScaleFactor] is greater
-  /// than 1 for larger, and between 0 and 1 for smaller. It usually comes from
-  /// [MediaQueryData.textScaleFactor].
-  ///
-  /// [sizeWithOverflow] can be used to determine the bounds the drawing of the
-  /// components that are outside of the regular slider bounds. It's the size of
-  /// the box, whose center is aligned with the slider's bounds, that the value
-  /// indicators must be drawn within. Typically, it is bigger than the slider.
   void paint(
     PaintingContext context,
     Offset center, {
@@ -1014,8 +989,6 @@
     SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   });
 
   /// Special instance of [SliderComponentShape] to skip the thumb drawing.
@@ -1231,9 +1204,6 @@
   /// left and right thumb.
   ///
   /// {@macro flutter.material.rangeSlider.shape.thumb}
-  ///
-  /// [isPressed] can be used to give the selected thumb additional selected
-  /// or pressed state visual feedback, such as a larger shadow.
   void paint(
     PaintingContext context,
     Offset center, {
@@ -1245,7 +1215,6 @@
     TextDirection textDirection,
     SliderThemeData sliderTheme,
     Thumb thumb,
-    bool isPressed,
   });
 }
 
@@ -1271,17 +1240,7 @@
   ///
   /// [labelPainter] helps determine the width of the shape. It is variable
   /// width because it is derived from a formatted string.
-  ///
-  /// [textScaleFactor] can be used to determine whether the component should
-  /// paint larger or smaller, depending on whether [textScaleFactor] is greater
-  /// than 1 for larger, and between 0 and 1 for smaller. It usually comes from
-  /// [MediaQueryData.textScaleFactor].
-  Size getPreferredSize(
-    bool isEnabled,
-    bool isDiscrete, {
-    TextPainter labelPainter,
-    double textScaleFactor,
-  });
+  Size getPreferredSize(bool isEnabled, bool isDiscrete, { TextPainter labelPainter });
 
   /// Determines the best offset to keep this shape on the screen.
   ///
@@ -1292,8 +1251,6 @@
     Offset center,
     TextPainter labelPainter,
     Animation<double> activationAnimation,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     return 0;
   }
@@ -1315,18 +1272,6 @@
   /// the default case, this is used to paint a stroke around the top indicator
   /// for better visibility between the two indicators.
   ///
-  /// [textScaleFactor] can be used to determine whether the component should
-  /// paint larger or smaller, depending on whether [textScaleFactor] is greater
-  /// than 1 for larger, and between 0 and 1 for smaller. It usually comes from
-  /// [MediaQueryData.textScaleFactor].
-  ///
-  /// [sizeWithOverflow] can be used to determine the bounds the drawing of the
-  /// components that are outside of the regular slider bounds. It's the size of
-  /// the box, whose center is aligned with the slider's bounds, that the value
-  /// indicators must be drawn within. Typically, it is bigger than the slider.
-  ///
-  /// {@macro flutter.material.rangeSlider.shape.parentBox}
-  ///
   /// {@macro flutter.material.rangeSlider.shape.sliderTheme}
   ///
   /// [textDirection] can be used to determine how any extra text or graphics,
@@ -1344,8 +1289,6 @@
     bool isDiscrete,
     bool isOnTop,
     TextPainter labelPainter,
-    double textScaleFactor,
-    Size sizeWithOverflow,
     RenderBox parentBox,
     SliderThemeData sliderTheme,
     TextDirection textDirection,
@@ -1611,17 +1554,17 @@
     assert(thumbCenter != null);
     assert(isEnabled != null);
     assert(isDiscrete != null);
-    // If the slider [SliderThemeData.trackHeight] is less than or equal to 0,
-    // then it makes no difference whether the track is painted or not,
-    // therefore the painting can be a no-op.
+    // If the slider track height is less than or equal to 0, then it makes no
+    // difference whether the track is painted or not, therefore the painting
+    // can be a no-op.
     if (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 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);
     Paint leftTrackPaint;
@@ -1645,10 +1588,11 @@
       isDiscrete: isDiscrete,
     );
 
-    final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRect.height / 2, trackRect.top, thumbCenter.dx, trackRect.bottom);
+    final Size thumbSize = sliderTheme.thumbShape.getPreferredSize(isEnabled, isDiscrete);
+    final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRect.height / 2, trackRect.top, thumbCenter.dx - thumbSize.width / 2, trackRect.bottom);
     if (!leftTrackSegment.isEmpty)
       context.canvas.drawRect(leftTrackSegment, leftTrackPaint);
-    final Rect rightTrackSegment = Rect.fromLTRB(thumbCenter.dx, trackRect.top, trackRect.right, trackRect.bottom);
+    final Rect rightTrackSegment = Rect.fromLTRB(thumbCenter.dx + thumbSize.width / 2, trackRect.top, trackRect.right, trackRect.bottom);
     if (!rightTrackSegment.isEmpty)
       context.canvas.drawRect(rightTrackSegment, rightTrackPaint);
   }
@@ -1704,9 +1648,9 @@
     assert(enableAnimation != null);
     assert(textDirection != null);
     assert(thumbCenter != null);
-    // If the slider [SliderThemeData.trackHeight] is less than or equal to 0,
-    // then it makes no difference whether the track is painted or not,
-    // therefore the painting  can be a no-op.
+    // If the slider track height is less than or equal to 0, then it makes no
+    // difference whether the track is painted or not, therefore the painting
+    // can be a no-op.
     if (sliderTheme.trackHeight <= 0) {
       return;
     }
@@ -1737,30 +1681,22 @@
       isEnabled: isEnabled,
       isDiscrete: isDiscrete,
     );
-    final Radius trackRadius = Radius.circular(trackRect.height / 2);
 
-    context.canvas.drawRRect(
-      RRect.fromLTRBAndCorners(
-        trackRect.left,
-        trackRect.top,
-        thumbCenter.dx,
-        trackRect.bottom,
-        topLeft: trackRadius,
-        bottomLeft: trackRadius,
-      ),
-      leftTrackPaint,
-    );
-    context.canvas.drawRRect(
-      RRect.fromLTRBAndCorners(
-        thumbCenter.dx,
-        trackRect.top,
-        trackRect.right,
-        trackRect.bottom,
-        topRight: trackRadius,
-        bottomRight: trackRadius,
-      ),
-      rightTrackPaint,
-    );
+    // The arc rects create a semi-circle with radius equal to track height.
+    final Rect leftTrackArcRect = Rect.fromLTWH(trackRect.left, trackRect.top, trackRect.height, trackRect.height);
+    if (!leftTrackArcRect.isEmpty)
+      context.canvas.drawArc(leftTrackArcRect, math.pi / 2, math.pi, false, leftTrackPaint);
+    final Rect rightTrackArcRect = Rect.fromLTWH(trackRect.right - trackRect.height / 2, trackRect.top, trackRect.height, trackRect.height);
+    if (!rightTrackArcRect.isEmpty)
+      context.canvas.drawArc(rightTrackArcRect, -math.pi / 2, math.pi, false, rightTrackPaint);
+
+    final Size thumbSize = sliderTheme.thumbShape.getPreferredSize(isEnabled, isDiscrete);
+    final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRect.height / 2, trackRect.top, thumbCenter.dx - thumbSize.width / 2, trackRect.bottom);
+    if (!leftTrackSegment.isEmpty)
+      context.canvas.drawRect(leftTrackSegment, leftTrackPaint);
+    final Rect rightTrackSegment = Rect.fromLTRB(thumbCenter.dx + thumbSize.width / 2, trackRect.top, trackRect.right, trackRect.bottom);
+    if (!rightTrackSegment.isEmpty)
+      context.canvas.drawRect(rightTrackSegment, rightTrackPaint);
   }
 }
 
@@ -1976,11 +1912,6 @@
     assert(isEnabled != null);
     assert(isDiscrete != null);
     assert(textDirection != null);
-
-    if (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);
@@ -2011,39 +1942,25 @@
       isEnabled: isEnabled,
       isDiscrete: isDiscrete,
     );
-    final Radius trackRadius = Radius.circular(trackRect.height / 2);
+    final double trackRadius = trackRect.height / 2;
 
-    context.canvas.drawRRect(
-      RRect.fromLTRBAndCorners(
-        trackRect.left,
-        trackRect.top,
-        leftThumbOffset.dx,
-        trackRect.bottom,
-        topLeft: trackRadius,
-        bottomLeft: trackRadius,
-      ),
-      inactivePaint,
-    );
-    context.canvas.drawRect(
-      Rect.fromLTRB(
-        leftThumbOffset.dx,
-        trackRect.top,
-        rightThumbOffset.dx,
-        trackRect.bottom,
-      ),
-      activePaint,
-    );
-    context.canvas.drawRRect(
-      RRect.fromLTRBAndCorners(
-        rightThumbOffset.dx,
-        trackRect.top,
-        trackRect.right,
-        trackRect.bottom,
-        topRight: trackRadius,
-        bottomRight: trackRadius,
-      ),
-      inactivePaint,
-    );
+    final Rect leftTrackArcRect = Rect.fromLTWH(trackRect.left, trackRect.top, trackRect.height, trackRect.height);
+    if (!leftTrackArcRect.isEmpty)
+      context.canvas.drawArc(leftTrackArcRect, math.pi / 2, math.pi, false, inactivePaint);
+
+    final Rect leftTrackSegment = Rect.fromLTRB(trackRect.left + trackRadius, trackRect.top, leftThumbOffset.dx - thumbRadius, trackRect.bottom);
+    if (!leftTrackSegment.isEmpty)
+      context.canvas.drawRect(leftTrackSegment, inactivePaint);
+    final Rect middleTrackSegment = Rect.fromLTRB(leftThumbOffset.dx + thumbRadius, trackRect.top, rightThumbOffset.dx - thumbRadius, trackRect.bottom);
+    if (!middleTrackSegment.isEmpty)
+      context.canvas.drawRect(middleTrackSegment, activePaint);
+    final Rect rightTrackSegment = Rect.fromLTRB(rightThumbOffset.dx + thumbRadius, trackRect.top, trackRect.right - trackRadius, trackRect.bottom);
+    if (!rightTrackSegment.isEmpty)
+      context.canvas.drawRect(rightTrackSegment, inactivePaint);
+
+    final Rect rightTrackArcRect = Rect.fromLTWH(trackRect.right - trackRect.height, trackRect.top, trackRect.height, trackRect.height);
+    if (!rightTrackArcRect.isEmpty)
+      context.canvas.drawArc(rightTrackArcRect, -math.pi / 2, math.pi, false, inactivePaint);
   }
 }
 
@@ -2071,8 +1988,7 @@
 
   /// The preferred radius of the round tick mark.
   ///
-  /// If it is not provided, then 1/4 of the [SliderThemeData.trackHeight] is
-  /// used.
+  /// If it is not provided, then half of the track height is used.
   final double tickMarkRadius;
 
   @override
@@ -2083,10 +1999,9 @@
     assert(sliderTheme != null);
     assert(sliderTheme.trackHeight != null);
     assert(isEnabled != null);
-    // The tick marks are tiny circles. If no radius is provided, then the
-    // radius is defaulted to be 1/4 of the [SliderThemeData.trackHeight], or a
-    // diameter of half the [SliderThemeData.trackHeight].
-    return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 4);
+    // The tick marks are tiny circles. If no radius is provided, then they are
+    // defaulted to be the same height as the track.
+    return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 2);
   }
 
   @override
@@ -2165,8 +2080,7 @@
 
   /// The preferred radius of the round tick mark.
   ///
-  /// If it is not provided, then 1/4 of the [SliderThemeData.trackHeight] is
-  /// used.
+  /// If it is not provided, then half of the track height is used.
   final double tickMarkRadius;
 
   @override
@@ -2177,7 +2091,7 @@
     assert(sliderTheme != null);
     assert(sliderTheme.trackHeight != null);
     assert(isEnabled != null);
-    return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 4);
+    return Size.fromRadius(tickMarkRadius ?? sliderTheme.trackHeight / 2);
   }
 
   @override
@@ -2286,8 +2200,6 @@
     SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     // no-op.
   }
@@ -2305,8 +2217,6 @@
   const RoundSliderThumbShape({
     this.enabledThumbRadius = 10.0,
     this.disabledThumbRadius,
-    this.elevation = 1.0,
-    this.pressedElevation = 6.0,
   });
 
   /// The preferred radius of the round thumb shape when the slider is enabled.
@@ -2321,22 +2231,6 @@
   final double disabledThumbRadius;
   double get _disabledThumbRadius =>  disabledThumbRadius ?? enabledThumbRadius;
 
-  /// The resting elevation adds shadow to the unpressed thumb.
-  ///
-  /// The default is 1.
-  ///
-  /// Use 0 for no shadow. The higher the value, the larger the shadow. For
-  /// example, a value of 12 will create a very large shadow.
-  final double elevation;
-
-  /// The pressed elevation adds shadow to the pressed thumb.
-  ///
-  /// The default is 6.
-  ///
-  /// Use 0 for no shadow. The higher the value, the larger the shadow. For
-  /// example, a value of 12 will create a very large shadow.
-  final double pressedElevation;
-
   @override
   Size getPreferredSize(bool isEnabled, bool isDiscrete) {
     return Size.fromRadius(isEnabled == true ? enabledThumbRadius : _disabledThumbRadius);
@@ -2354,8 +2248,6 @@
     @required SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     assert(context != null);
     assert(center != null);
@@ -2363,7 +2255,6 @@
     assert(sliderTheme != null);
     assert(sliderTheme.disabledThumbColor != null);
     assert(sliderTheme.thumbColor != null);
-    assert(!sizeWithOverflow.isEmpty);
 
     final Canvas canvas = context.canvas;
     final Tween<double> radiusTween = Tween<double>(
@@ -2374,31 +2265,10 @@
       begin: sliderTheme.disabledThumbColor,
       end: sliderTheme.thumbColor,
     );
-    final Tween<double> elevationTween = Tween<double>(
-      begin: elevation,
-      end: pressedElevation,
-    );
-
-    final double evaluatedElevation = elevationTween.evaluate(activationAnimation);
-    final Color color = colorTween.evaluate(enableAnimation);
-    final double radius = radiusTween.evaluate(enableAnimation);
-    final Path path = Path()..addArc(Rect.fromCenter(center: center, width: 2 * radius, height: 2 * radius), 0, math.pi * 2);
-    canvas.drawShadow(path, Colors.black, evaluatedElevation, true);
-
-    // If the thumb is translucent, clear the space of the track and shadow so
-    // the thumb can be drawn without interference.
-    if (color.alpha != 0xff) {
-      canvas.drawCircle(
-        center,
-        radius,
-        Paint()..color = sliderTheme.surfaceColor.withOpacity(1),
-      );
-    }
-
     canvas.drawCircle(
       center,
-      radius,
-      Paint()..color = color,
+      radiusTween.evaluate(enableAnimation),
+      Paint()..color = colorTween.evaluate(enableAnimation),
     );
   }
 }
@@ -2415,8 +2285,6 @@
   const RoundRangeSliderThumbShape({
     this.enabledThumbRadius = 10.0,
     this.disabledThumbRadius,
-    this.elevation = 1.0,
-    this.pressedElevation = 6.0,
   }) : assert(enabledThumbRadius != null);
 
   /// The preferred radius of the round thumb shape when the slider is enabled.
@@ -2431,16 +2299,6 @@
   final double disabledThumbRadius;
   double get _disabledThumbRadius =>  disabledThumbRadius ?? enabledThumbRadius;
 
-  /// The resting elevation adds shadow to the unpressed thumb.
-  ///
-  /// The default is 1.
-  final double elevation;
-
-  /// The pressed elevation adds shadow to the pressed thumb.
-  ///
-  /// The default is 6.
-  final double pressedElevation;
-
   @override
   Size getPreferredSize(bool isEnabled, bool isDiscrete) {
     return Size.fromRadius(isEnabled == true ? enabledThumbRadius : _disabledThumbRadius);
@@ -2458,7 +2316,6 @@
     @required SliderThemeData sliderTheme,
     TextDirection textDirection,
     Thumb thumb,
-    bool isPressed,
   }) {
     assert(context != null);
     assert(center != null);
@@ -2477,10 +2334,6 @@
       end: sliderTheme.thumbColor,
     );
     final double radius = radiusTween.evaluate(enableAnimation);
-    final Tween<double> elevationTween = Tween<double>(
-      begin: elevation,
-      end: pressedElevation,
-    );
 
     // Add a stroke of 1dp around the circle if this thumb would overlap
     // the other thumb.
@@ -2510,26 +2363,10 @@
       }
     }
 
-    final double evaluatedElevation = isPressed ? elevationTween.evaluate(activationAnimation) : elevation;
-    final Color color = colorTween.evaluate(enableAnimation);
-    final Path shadowPath = Path()..addArc(Rect.fromCenter(center: center, width: 2 * radius, height: 2 * radius), 0, math.pi * 2);
-    canvas.drawShadow(shadowPath, Colors.black, evaluatedElevation, true);
-
-    // If the thumb is translucent, clear the space of the track and shadow so
-    // the thumb can be drawn without interference.
-    if (color.alpha != 0xff) {
-      canvas.drawCircle(
-        center,
-        radius,
-        Paint()
-          ..color = sliderTheme.surfaceColor.withOpacity(1),
-      );
-    }
-
     canvas.drawCircle(
       center,
       radius,
-      Paint()..color = color,
+      Paint()..color = colorTween.evaluate(enableAnimation),
     );
   }
 }
@@ -2555,8 +2392,7 @@
 
   /// The preferred radius of the round thumb shape when enabled.
   ///
-  /// If it is not provided, then half of the [SliderThemeData.trackHeight] is
-  /// used.
+  /// If it is not provided, then half of the track height is used.
   final double overlayRadius;
 
   @override
@@ -2576,8 +2412,6 @@
     @required SliderThemeData sliderTheme,
     @required TextDirection textDirection,
     @required double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     assert(context != null);
     assert(center != null);
@@ -2610,20 +2444,16 @@
 ///  * [Slider], which includes a value indicator defined by this shape.
 ///  * [SliderTheme], which can be used to configure the slider value indicator
 ///    of all sliders in a widget subtree.
-class RectangularSliderValueIndicatorShape extends SliderComponentShape {
-  /// Create a slider value indicator that resembles a rectangular tooltip.
-  const RectangularSliderValueIndicatorShape();
+class PaddleSliderValueIndicatorShape extends SliderComponentShape {
+  /// Create a slider value indicator in the shape of an upside-down pear.
+  const PaddleSliderValueIndicatorShape();
 
-  static const _RectangularSliderValueIndicatorPathPainter _pathPainter = _RectangularSliderValueIndicatorPathPainter();
+  static const _PaddleSliderTrackShapePathPainter _pathPainter = _PaddleSliderTrackShapePathPainter();
 
   @override
-  Size getPreferredSize(bool isEnabled, bool isDiscrete, {
-    @required TextPainter labelPainter,
-    @required double textScaleFactor,
-  }) {
+  Size getPreferredSize(bool isEnabled, bool isDiscrete, { @required TextPainter labelPainter }) {
     assert(labelPainter != null);
-    assert(textScaleFactor != null && textScaleFactor >= 0);
-    return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
+    return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter);
   }
 
   @override
@@ -2638,20 +2468,26 @@
     @required SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
-    final Canvas canvas = context.canvas;
-    final double scale = activationAnimation.value;
-    _pathPainter.paint(
-      parentBox: parentBox,
-      canvas: canvas,
-      center: center,
-      scale: scale,
-      labelPainter: labelPainter,
-      textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
-      backgroundPaintColor: sliderTheme.valueIndicatorColor
+    assert(context != null);
+    assert(center != null);
+    assert(activationAnimation != null);
+    assert(enableAnimation != null);
+    assert(labelPainter != null);
+    assert(parentBox != null);
+    assert(sliderTheme != null);
+    final ColorTween enableColor = ColorTween(
+      begin: sliderTheme.disabledThumbColor,
+      end: sliderTheme.valueIndicatorColor,
+    );
+    _pathPainter.drawValueIndicator(
+      parentBox,
+      context.canvas,
+      center,
+      Paint()..color = enableColor.evaluate(enableAnimation),
+      activationAnimation.value,
+      labelPainter,
+      null,
     );
   }
 }
@@ -2663,283 +2499,16 @@
 ///  * [RangeSlider], which includes value indicators defined by this shape.
 ///  * [SliderTheme], which can be used to configure the range slider value
 ///    indicator of all sliders in a widget subtree.
-class RectangularRangeSliderValueIndicatorShape extends RangeSliderValueIndicatorShape {
-  /// Create a range slider value indicator that resembles a rectangular tooltip.
-  const RectangularRangeSliderValueIndicatorShape();
-
-  static const _RectangularSliderValueIndicatorPathPainter _pathPainter = _RectangularSliderValueIndicatorPathPainter();
-
-  @override
-  Size getPreferredSize(
-    bool isEnabled,
-    bool isDiscrete, {
-    @required TextPainter labelPainter,
-    @required double textScaleFactor,
-  }) {
-    assert(labelPainter != null);
-    assert(textScaleFactor != null && textScaleFactor >= 0);
-    return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
-  }
-
-  @override
-  double getHorizontalShift({
-    RenderBox parentBox,
-    Offset center,
-    TextPainter labelPainter,
-    Animation<double> activationAnimation,
-    double textScaleFactor,
-    Size sizeWithOverflow,
-  }) {
-    return _pathPainter.getHorizontalShift(
-      parentBox: parentBox,
-      center: center,
-      labelPainter: labelPainter,
-      textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
-      scale: activationAnimation.value,
-    );
-  }
-
-  @override
-  void paint(
-    PaintingContext context,
-    Offset center, {
-    Animation<double> activationAnimation,
-    Animation<double> enableAnimation,
-    bool isDiscrete,
-    bool isOnTop,
-    TextPainter labelPainter,
-    double textScaleFactor,
-    Size sizeWithOverflow,
-    RenderBox parentBox,
-    SliderThemeData sliderTheme,
-    TextDirection textDirection,
-    double value,
-    Thumb thumb,
-  }) {
-    final Canvas canvas = context.canvas;
-    final double scale = activationAnimation.value;
-    _pathPainter.paint(
-      parentBox: parentBox,
-      canvas: canvas,
-      center: center,
-      scale: scale,
-      labelPainter: labelPainter,
-      textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
-      backgroundPaintColor: sliderTheme.valueIndicatorColor,
-      strokePaintColor: isOnTop ? sliderTheme.overlappingShapeStrokeColor : null,
-    );
-  }
-}
-
-class _RectangularSliderValueIndicatorPathPainter {
-  const _RectangularSliderValueIndicatorPathPainter();
-
-  static const double _triangleHeight = 8.0;
-  static const double _labelPadding = 16.0;
-  static const double _preferredHeight = 32.0;
-  static const double _minLabelWidth = 16.0;
-  static const double _bottomTipYOffset = 14.0;
-  static const double _preferredHalfHeight = _preferredHeight / 2;
-  static const double _upperRectRadius = 4;
-
-  Size getPreferredSize(
-    bool isEnabled,
-    bool isDiscrete,
-    TextPainter labelPainter,
-    double textScaleFactor,
-  ) {
-    assert(labelPainter != null);
-    return Size(
-      _upperRectangleWidth(labelPainter, 1, textScaleFactor),
-      labelPainter.height + _labelPadding,
-    );
-  }
-
-  double getHorizontalShift({
-    RenderBox parentBox,
-    Offset center,
-    TextPainter labelPainter,
-    double textScaleFactor,
-    Size sizeWithOverflow,
-    double scale,
-  }) {
-    assert(!sizeWithOverflow.isEmpty);
-    const double edgePadding = 8.0;
-    final double rectangleWidth = _upperRectangleWidth(labelPainter, scale, textScaleFactor);
-
-    // The rectangle must be shifted towards the center so that it minimizes the
-    // chance of it rendering outside the bounds of the render box. If the shift
-    // is negative, then the lobe is shifted from right to left, and if it is
-    // positive, then the lobe is shifted from left to right.
-    final double overflowLeft = math.max(0, rectangleWidth / 2 - center.dx + edgePadding);
-    final double overflowRight = math.max(0, rectangleWidth / 2 - (sizeWithOverflow.width - center.dx - edgePadding));
-    return overflowLeft - overflowRight;
-  }
-
-  double _upperRectangleWidth(TextPainter labelPainter, double scale, double textScaleFactor) {
-    final double unscaledWidth = math.max(_minLabelWidth * textScaleFactor, labelPainter.width) + _labelPadding * 2;
-    return unscaledWidth * scale;
-  }
-
-  void paint({
-    RenderBox parentBox,
-    Canvas canvas,
-    Offset center,
-    double scale,
-    TextPainter labelPainter,
-    double textScaleFactor,
-    Size sizeWithOverflow,
-    Color backgroundPaintColor,
-    Color strokePaintColor,
-  }) {
-    if (scale == 0.0) {
-      // Zero scale essentially means "do not draw anything", so it's safe to just return.
-      return;
-    }
-    assert(!sizeWithOverflow.isEmpty);
-
-    final double rectangleWidth = _upperRectangleWidth(labelPainter, scale, textScaleFactor);
-    final double horizontalShift = getHorizontalShift(
-      parentBox: parentBox,
-      center: center,
-      labelPainter: labelPainter,
-      textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
-      scale: scale,
-    );
-
-    final double rectHeight = labelPainter.height + _labelPadding;
-    final Rect upperRect = Rect.fromLTWH(
-      -rectangleWidth / 2 + horizontalShift,
-      -_triangleHeight - rectHeight,
-      rectangleWidth,
-      rectHeight,
-    );
-
-    final Path trianglePath = Path()
-      ..lineTo(-_triangleHeight, -_triangleHeight)
-      ..lineTo(_triangleHeight, -_triangleHeight)
-      ..close();
-    final Paint fillPaint = Paint()..color = backgroundPaintColor;
-    final RRect upperRRect = RRect.fromRectAndRadius(upperRect, const Radius.circular(_upperRectRadius));
-    trianglePath.addRRect(upperRRect);
-
-    canvas.save();
-    // Prepare the canvas for the base of the tooltip, which is relative to the
-    // center of the thumb.
-    canvas.translate(center.dx, center.dy - _bottomTipYOffset);
-    canvas.scale(scale, scale);
-    if (strokePaintColor != null) {
-      final Paint strokePaint = Paint()
-        ..color = strokePaintColor
-        ..strokeWidth = 1.0
-        ..style = PaintingStyle.stroke;
-      canvas.drawPath(trianglePath, strokePaint);
-    }
-    canvas.drawPath(trianglePath, fillPaint);
-
-    // The label text is centered within the value indicator.
-    final double bottomTipToUpperRectTranslateY = -_preferredHalfHeight / 2 - upperRect.height;
-    canvas.translate(0, bottomTipToUpperRectTranslateY);
-    final Offset boxCenter = Offset(horizontalShift, upperRect.height / 2);
-    final Offset halfLabelPainterOffset = Offset(labelPainter.width / 2, labelPainter.height / 2);
-    final Offset labelOffset = boxCenter - halfLabelPainterOffset;
-    labelPainter.paint(canvas, labelOffset);
-    canvas.restore();
-  }
-}
-
-/// A variant shape of a [Slider]'s value indicator .
-///
-/// See also:
-///
-///  * [Slider], which includes a value indicator defined by this shape.
-///  * [SliderTheme], which can be used to configure the slider value indicator
-///    of all sliders in a widget subtree.
-class PaddleSliderValueIndicatorShape extends SliderComponentShape {
-  /// Create a slider value indicator in the shape of an upside-down pear.
-  const PaddleSliderValueIndicatorShape();
-
-  static const _PaddleSliderValueIndicatorPathPainter _pathPainter = _PaddleSliderValueIndicatorPathPainter();
-
-  @override
-  Size getPreferredSize(
-    bool isEnabled,
-    bool isDiscrete, {
-    @required TextPainter labelPainter,
-    @required double textScaleFactor,
-  }) {
-    assert(labelPainter != null);
-    assert(textScaleFactor != null && textScaleFactor >= 0);
-    return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
-  }
-
-  @override
-  void paint(
-    PaintingContext context,
-    Offset center, {
-    @required Animation<double> activationAnimation,
-    @required Animation<double> enableAnimation,
-    bool isDiscrete,
-    @required TextPainter labelPainter,
-    @required RenderBox parentBox,
-    @required SliderThemeData sliderTheme,
-    TextDirection textDirection,
-    double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
-  }) {
-    assert(context != null);
-    assert(center != null);
-    assert(activationAnimation != null);
-    assert(enableAnimation != null);
-    assert(labelPainter != null);
-    assert(parentBox != null);
-    assert(sliderTheme != null);
-    assert(!sizeWithOverflow.isEmpty);
-    final ColorTween enableColor = ColorTween(
-      begin: sliderTheme.disabledThumbColor,
-      end: sliderTheme.valueIndicatorColor,
-    );
-    _pathPainter.paint(
-      parentBox,
-      context.canvas,
-      center,
-      Paint()..color = enableColor.evaluate(enableAnimation),
-      activationAnimation.value,
-      labelPainter,
-      textScaleFactor,
-      sizeWithOverflow,
-      null,
-    );
-  }
-}
-
-/// A variant shape of a [RangeSlider]'s value indicators.
-///
-/// See also:
-///
-///  * [RangeSlider], which includes value indicators defined by this shape.
-///  * [SliderTheme], which can be used to configure the range slider value
-///    indicator of all sliders in a widget subtree.
 class PaddleRangeSliderValueIndicatorShape extends RangeSliderValueIndicatorShape {
   /// Create a slider value indicator in the shape of an upside-down pear.
   const PaddleRangeSliderValueIndicatorShape();
 
-  static const _PaddleSliderValueIndicatorPathPainter _pathPainter = _PaddleSliderValueIndicatorPathPainter();
+  static const _PaddleSliderTrackShapePathPainter _pathPainter = _PaddleSliderTrackShapePathPainter();
 
   @override
-  Size getPreferredSize(
-    bool isEnabled,
-    bool isDiscrete, {
-    @required TextPainter labelPainter,
-    @required double textScaleFactor,
-  }) {
+  Size getPreferredSize(bool isEnabled, bool isDiscrete, { @required TextPainter labelPainter }) {
     assert(labelPainter != null);
-    assert(textScaleFactor != null && textScaleFactor >= 0);
-    return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter, textScaleFactor);
+    return _pathPainter.getPreferredSize(isEnabled, isDiscrete, labelPainter);
   }
 
   @override
@@ -2948,16 +2517,12 @@
     Offset center,
     TextPainter labelPainter,
     Animation<double> activationAnimation,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     return _pathPainter.getHorizontalShift(
       parentBox: parentBox,
       center: center,
       labelPainter: labelPainter,
       scale: activationAnimation.value,
-      textScaleFactor: textScaleFactor,
-      sizeWithOverflow: sizeWithOverflow,
     );
   }
 
@@ -2975,8 +2540,6 @@
     TextDirection textDirection,
     Thumb thumb,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     assert(context != null);
     assert(center != null);
@@ -2985,28 +2548,25 @@
     assert(labelPainter != null);
     assert(parentBox != null);
     assert(sliderTheme != null);
-    assert(!sizeWithOverflow.isEmpty);
     final ColorTween enableColor = ColorTween(
       begin: sliderTheme.disabledThumbColor,
       end: sliderTheme.valueIndicatorColor,
     );
     // Add a stroke of 1dp around the top paddle.
-    _pathPainter.paint(
+    _pathPainter.drawValueIndicator(
       parentBox,
       context.canvas,
       center,
       Paint()..color = enableColor.evaluate(enableAnimation),
       activationAnimation.value,
       labelPainter,
-      textScaleFactor,
-      sizeWithOverflow,
       isOnTop ? sliderTheme.overlappingShapeStrokeColor : null,
     );
   }
 }
 
-class _PaddleSliderValueIndicatorPathPainter {
-  const _PaddleSliderValueIndicatorPathPainter();
+class _PaddleSliderTrackShapePathPainter {
+  const _PaddleSliderTrackShapePathPainter();
 
   // These constants define the shape of the default value indicator.
   // The value indicator changes shape based on the size of
@@ -3016,12 +2576,14 @@
 
   // Radius of the top lobe of the value indicator.
   static const double _topLobeRadius = 16.0;
-  static const double _minLabelWidth = 16.0;
+  // Designed size of the label text. This is the size that the value indicator
+  // was designed to contain. We scale it from here to fit other sizes.
+  static const double _labelTextDesignSize = 14.0;
   // Radius of the bottom lobe of the value indicator.
   static const double _bottomLobeRadius = 10.0;
   static const double _labelPadding = 8.0;
   static const double _distanceBetweenTopBottomCenters = 40.0;
-  static const double _middleNeckWidth = 3.0;
+  static const double _middleNeckWidth = 2.0;
   static const double _bottomNeckRadius = 4.5;
   // The base of the triangle between the top lobe center and the centers of
   // the two top neck arcs.
@@ -3049,12 +2611,10 @@
     bool isEnabled,
     bool isDiscrete,
     TextPainter labelPainter,
-    double textScaleFactor,
   ) {
     assert(labelPainter != null);
-    assert(textScaleFactor != null && textScaleFactor >= 0);
-    final double width = math.max(_minLabelWidth * textScaleFactor, labelPainter.width) + _labelPadding * 2 * textScaleFactor;
-    return Size(width, _preferredHeight * textScaleFactor);
+    final double textScaleFactor = labelPainter.height / _labelTextDesignSize;
+    return Size(labelPainter.width + 2 * _labelPadding * textScaleFactor, _preferredHeight * textScaleFactor);
   }
 
   // Adds an arc to the path that has the attributes passed in. This is
@@ -3070,17 +2630,15 @@
     Offset center,
     TextPainter labelPainter,
     double scale,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
-    assert(!sizeWithOverflow.isEmpty);
+    final double textScaleFactor = labelPainter.height / _labelTextDesignSize;
     final double inverseTextScale = textScaleFactor != 0 ? 1.0 / textScaleFactor : 0.0;
     final double labelHalfWidth = labelPainter.width / 2.0;
     final double halfWidthNeeded = math.max(
       0.0,
       inverseTextScale * labelHalfWidth - (_topLobeRadius - _labelPadding),
     );
-    final double shift = _getIdealOffset(parentBox, halfWidthNeeded, textScaleFactor * scale, center, sizeWithOverflow.width);
+    final double shift = _getIdealOffset(parentBox, halfWidthNeeded, textScaleFactor * scale, center);
     return shift * textScaleFactor;
   }
 
@@ -3091,9 +2649,8 @@
     double halfWidthNeeded,
     double scale,
     Offset center,
-    double widthWithOverflow,
   ) {
-    const double edgeMargin = 8.0;
+    const double edgeMargin = 4.0;
     final Rect topLobeRect = Rect.fromLTWH(
       -_topLobeRadius - halfWidthNeeded,
       -_topLobeRadius - _distanceBetweenTopBottomCenters,
@@ -3106,11 +2663,12 @@
     final Offset bottomRight = (topLobeRect.bottomRight * scale) + center;
     double shift = 0.0;
 
-    if (topLeft.dx < edgeMargin) {
-      shift = edgeMargin - topLeft.dx;
+    final double startGlobal = parentBox.localToGlobal(Offset.zero).dx;
+    if (topLeft.dx < startGlobal + edgeMargin) {
+      shift = startGlobal + edgeMargin - topLeft.dx;
     }
 
-    final double endGlobal = widthWithOverflow;
+    final double endGlobal = parentBox.localToGlobal(Offset(parentBox.size.width, parentBox.size.height)).dx;
     if (bottomRight.dx > endGlobal - edgeMargin) {
       shift = endGlobal - edgeMargin - bottomRight.dx;
     }
@@ -3126,15 +2684,13 @@
     return shift;
   }
 
-  void paint(
+  void drawValueIndicator(
     RenderBox parentBox,
     Canvas canvas,
     Offset center,
     Paint paint,
     double scale,
     TextPainter labelPainter,
-    double textScaleFactor,
-    Size sizeWithOverflow,
     Color strokePaintColor,
   ) {
     if (scale == 0.0) {
@@ -3142,10 +2698,10 @@
       // our math below will attempt to divide by zero and send needless NaNs to the engine.
       return;
     }
-    assert(!sizeWithOverflow.isEmpty);
 
     // The entire value indicator should scale with the size of the label,
     // to keep it large enough to encompass the label text.
+    final double textScaleFactor = labelPainter.height / _labelTextDesignSize;
     final double overallScale = scale * textScaleFactor;
     final double inverseTextScale = textScaleFactor != 0 ? 1.0 / textScaleFactor : 0.0;
     final double labelHalfWidth = labelPainter.width / 2.0;
@@ -3187,7 +2743,7 @@
       inverseTextScale * labelHalfWidth - (_topLobeRadius - _labelPadding),
     );
 
-    final double shift = _getIdealOffset(parentBox, halfWidthNeeded, overallScale, center, sizeWithOverflow.width);
+    final double shift = _getIdealOffset(parentBox, halfWidthNeeded, overallScale, center);
     final double leftWidthNeeded = halfWidthNeeded - shift;
     final double rightWidthNeeded = halfWidthNeeded + shift;
 
@@ -3196,8 +2752,7 @@
     final double leftAmount = math.max(0.0, math.min(1.0, leftWidthNeeded / _neckTriangleBase));
     final double rightAmount = math.max(0.0, math.min(1.0, rightWidthNeeded / _neckTriangleBase));
     // The angle between the top neck arc's center and the top lobe's center
-    // and vertical. The base amount is chosen so that the neck is smooth,
-    // even when the lobe is shifted due to its size.
+    // and vertical.
     final double leftTheta = (1.0 - leftAmount) * _thirtyDegrees;
     final double rightTheta = (1.0 - rightAmount) * _thirtyDegrees;
     // The center of the top left neck arc.
diff --git a/packages/flutter/test/material/inherited_theme_test.dart b/packages/flutter/test/material/inherited_theme_test.dart
index dde7920..07ea067 100644
--- a/packages/flutter/test/material/inherited_theme_test.dart
+++ b/packages/flutter/test/material/inherited_theme_test.dart
@@ -525,7 +525,7 @@
     await tester.tap(find.text('push wrapped'));
     await tester.pumpAndSettle(); // route animation
     RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-    expect(sliderBox, paints..rrect(color: activeTrackColor)..rrect(color: inactiveTrackColor));
+    expect(sliderBox, paints..rect(color: activeTrackColor)..rect(color: inactiveTrackColor));
     expect(sliderBox, paints..circle(color: thumbColor));
 
     Navigator.of(navigatorContext).pop();
@@ -534,7 +534,7 @@
     await tester.tap(find.text('push unwrapped'));
     await tester.pumpAndSettle(); // route animation
     sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-    expect(sliderBox, isNot(paints..rrect(color: activeTrackColor)..rrect(color: inactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: activeTrackColor)..rect(color: inactiveTrackColor)));
     expect(sliderBox, isNot(paints..circle(color: thumbColor)));
   });
 
diff --git a/packages/flutter/test/material/range_slider_test.dart b/packages/flutter/test/material/range_slider_test.dart
index b9b3afe..4972ea0 100644
--- a/packages/flutter/test/material/range_slider_test.dart
+++ b/packages/flutter/test/material/range_slider_test.dart
@@ -1033,17 +1033,15 @@
 
     // Check default theme for enabled widget.
     expect(sliderBox, paints
-      ..rrect(color: sliderTheme.inactiveTrackColor)
+      ..rect(color: sliderTheme.inactiveTrackColor)
       ..rect(color: sliderTheme.activeTrackColor)
-      ..rrect(color: sliderTheme.inactiveTrackColor));
+      ..rect(color: sliderTheme.inactiveTrackColor));
     expect(sliderBox, paints
       ..circle(color: sliderTheme.thumbColor)
       ..circle(color: sliderTheme.thumbColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
   });
@@ -1060,22 +1058,18 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: sliderTheme.inactiveTrackColor)
+          ..rect(color: sliderTheme.inactiveTrackColor)
           ..rect(color: activeColor)
-          ..rrect(color: sliderTheme.inactiveTrackColor));
+          ..rect(color: sliderTheme.inactiveTrackColor));
     expect(
         sliderBox,
         paints
-          ..circle(color: Colors.white)
           ..circle(color: activeColor)
-          ..circle(color: Colors.white)
           ..circle(color: activeColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
   });
 
   testWidgets('Range Slider uses the right theme colors for the right shapes when setting the inactive color', (WidgetTester tester) async {
@@ -1090,9 +1084,9 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: inactiveColor)
+          ..rect(color: inactiveColor)
           ..rect(color: sliderTheme.activeTrackColor)
-          ..rrect(color: inactiveColor));
+          ..rect(color: inactiveColor));
     expect(
         sliderBox,
         paints
@@ -1101,8 +1095,6 @@
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
   });
 
   testWidgets('Range Slider uses the right theme colors for the right shapes with active and inactive colors', (WidgetTester tester) async {
@@ -1122,20 +1114,18 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: inactiveColor)
+          ..rect(color: inactiveColor)
           ..rect(color: activeColor)
-          ..rrect(color: inactiveColor));
+          ..rect(color: inactiveColor));
     expect(
         sliderBox,
         paints
-          ..circle(color: Colors.white)
           ..circle(color: activeColor)
-          ..circle(color: Colors.white)
           ..circle(color: activeColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
   });
 
   testWidgets('Range Slider uses the right theme colors for the right shapes for a discrete slider', (WidgetTester tester) async {
@@ -1149,9 +1139,9 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: sliderTheme.inactiveTrackColor)
+          ..rect(color: sliderTheme.inactiveTrackColor)
           ..rect(color: sliderTheme.activeTrackColor)
-          ..rrect(color: sliderTheme.inactiveTrackColor));
+          ..rect(color: sliderTheme.inactiveTrackColor));
     expect(
         sliderBox,
         paints
@@ -1164,8 +1154,6 @@
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
   });
 
   testWidgets('Range Slider uses the right theme colors for the right shapes for a discrete slider with active and inactive colors', (WidgetTester tester) async {
@@ -1187,9 +1175,9 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: inactiveColor)
+          ..rect(color: inactiveColor)
           ..rect(color: activeColor)
-          ..rrect(color: inactiveColor));
+          ..rect(color: inactiveColor));
     expect(
         sliderBox,
         paints
@@ -1197,16 +1185,12 @@
           ..circle(color: activeColor)
           ..circle(color: inactiveColor)
           ..circle(color: activeColor)
-          ..circle(color: Colors.white)
           ..circle(color: activeColor)
-          ..circle(color: Colors.white)
           ..circle(color: activeColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
   });
@@ -1222,14 +1206,12 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: sliderTheme.disabledInactiveTrackColor)
+          ..rect(color: sliderTheme.disabledInactiveTrackColor)
           ..rect(color: sliderTheme.disabledActiveTrackColor)
-          ..rrect(color: sliderTheme.disabledInactiveTrackColor));
+          ..rect(color: sliderTheme.disabledInactiveTrackColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
 
   });
 
@@ -1251,17 +1233,17 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: sliderTheme.disabledInactiveTrackColor)
+          ..rect(color: sliderTheme.disabledInactiveTrackColor)
           ..rect(color: sliderTheme.disabledActiveTrackColor)
-          ..rrect(color: sliderTheme.disabledInactiveTrackColor));
+          ..rect(color: sliderTheme.disabledInactiveTrackColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
     expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
   });
 
   testWidgets('Range Slider uses the right theme colors for the right shapes when the value indicators are showing', (WidgetTester tester) async {
+    const Color customColor1 = Color(0xcafefeed);
+    const Color customColor2 = Color(0xdeadbeef);
     final ThemeData theme = _buildTheme();
     final SliderThemeData sliderTheme = theme.sliderTheme;
     RangeValues values = const RangeValues(0.5, 0.75);
@@ -1303,7 +1285,7 @@
     final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(RangeSlider));
 
     final Offset topRight = tester.getTopRight(find.byType(RangeSlider)).translate(-24, 0);
-    final TestGesture gesture = await tester.startGesture(topRight);
+    TestGesture gesture = await tester.startGesture(topRight);
     // Wait for value indicator animation to finish.
     await tester.pumpAndSettle();
     expect(values.end, equals(1));
@@ -1316,6 +1298,24 @@
     await gesture.up();
     // Wait for value indicator animation to finish.
     await tester.pumpAndSettle();
+
+    // Testing the custom colors are used for the indicator.
+    await tester.pumpWidget(buildApp(
+      divisions: 3,
+      activeColor: customColor1,
+      inactiveColor: customColor2,
+    ));
+    gesture = await tester.startGesture(topRight);
+    // Wait for value indicator animation to finish.
+    await tester.pumpAndSettle();
+    expect(values.end, equals(1));
+    expect(
+      sliderBox,
+      paints
+        ..path(color: customColor1)
+        ..path(color: customColor1),
+    );
+    await gesture.up();
   });
 
   testWidgets('Range Slider top thumb gets stroked when overlapping', (WidgetTester tester) async {
diff --git a/packages/flutter/test/material/slider_test.dart b/packages/flutter/test/material/slider_test.dart
index f1019ee..4041672 100644
--- a/packages/flutter/test/material/slider_test.dart
+++ b/packages/flutter/test/material/slider_test.dart
@@ -39,8 +39,6 @@
     SliderThemeData sliderTheme,
     TextDirection textDirection,
     double value,
-    double textScaleFactor,
-    Size sizeWithOverflow,
   }) {
     log.add(thumbCenter);
     final Paint thumbPaint = Paint()..color = Colors.red;
@@ -584,7 +582,6 @@
         overlayColor: Color(0xff000010),
         thumbColor: Color(0xff000011),
         valueIndicatorColor: Color(0xff000012),
-        surfaceColor: Colors.white,
       ),
     );
     final SliderThemeData sliderTheme = theme.sliderTheme;
@@ -628,47 +625,43 @@
     final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
 
     // Check default theme for enabled widget.
-    expect(sliderBox, paints..rrect(color: sliderTheme.activeTrackColor)..rrect(color: sliderTheme.inactiveTrackColor));
-    expect(sliderBox, paints..shadow(color: const Color(0xff000000)));
+    expect(sliderBox, paints..rect(color: sliderTheme.activeTrackColor)..rect(color: sliderTheme.inactiveTrackColor));
     expect(sliderBox, paints..circle(color: sliderTheme.thumbColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
 
     // Test setting only the activeColor.
     await tester.pumpWidget(buildApp(activeColor: customColor1));
-    expect(sliderBox, paints..rrect(color: customColor1)..rrect(color: sliderTheme.inactiveTrackColor));
-    expect(sliderBox, paints..shadow(color: Colors.black));
-    expect(sliderBox, paints..circle(color: Colors.white)..circle(color: customColor1));
+    expect(sliderBox, paints..rect(color: customColor1)..rect(color: sliderTheme.inactiveTrackColor));
+    expect(sliderBox, paints..circle(color: customColor1));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
 
     // Test setting only the inactiveColor.
     await tester.pumpWidget(buildApp(inactiveColor: customColor1));
-    expect(sliderBox, paints..rrect(color: sliderTheme.activeTrackColor)..rrect(color: customColor1));
-    expect(sliderBox, paints..shadow(color: Colors.black));
+    expect(sliderBox, paints..rect(color: sliderTheme.activeTrackColor)..rect(color: customColor1));
     expect(sliderBox, paints..circle(color: sliderTheme.thumbColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
 
     // Test setting both activeColor and inactiveColor.
     await tester.pumpWidget(buildApp(activeColor: customColor1, inactiveColor: customColor2));
-    expect(sliderBox, paints..rrect(color: customColor1)..rrect(color: customColor2));
-    expect(sliderBox, paints..shadow(color: Colors.black));
-    expect(sliderBox, paints..circle(color: Colors.white)..circle(color: customColor1));
+    expect(sliderBox, paints..rect(color: customColor1)..rect(color: customColor2));
+    expect(sliderBox, paints..circle(color: customColor1));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
 
     // Test colors for discrete slider.
     await tester.pumpWidget(buildApp(divisions: 3));
-    expect(sliderBox, paints..rrect(color: sliderTheme.activeTrackColor)..rrect(color: sliderTheme.inactiveTrackColor));
+    expect(sliderBox, paints..rect(color: sliderTheme.activeTrackColor)..rect(color: sliderTheme.inactiveTrackColor));
     expect(
         sliderBox,
         paints
@@ -676,12 +669,10 @@
           ..circle(color: sliderTheme.activeTickMarkColor)
           ..circle(color: sliderTheme.inactiveTickMarkColor)
           ..circle(color: sliderTheme.inactiveTickMarkColor)
-          ..shadow(color: Colors.black)
-          ..circle(color: sliderTheme.thumbColor)
-    );
+          ..circle(color: sliderTheme.thumbColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
 
     // Test colors for discrete slider with inactiveColor and activeColor set.
     await tester.pumpWidget(buildApp(
@@ -689,7 +680,7 @@
       inactiveColor: customColor2,
       divisions: 3,
     ));
-    expect(sliderBox, paints..rrect(color: customColor1)..rrect(color: customColor2));
+    expect(sliderBox, paints..rect(color: customColor1)..rect(color: customColor2));
     expect(
         sliderBox,
         paints
@@ -697,13 +688,11 @@
           ..circle(color: customColor2)
           ..circle(color: customColor1)
           ..circle(color: customColor1)
-          ..shadow(color: Colors.black)
-          ..circle(color: Colors.white)
           ..circle(color: customColor1));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.disabledThumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledActiveTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.disabledInactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledActiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.disabledInactiveTrackColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.activeTickMarkColor)));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.inactiveTickMarkColor)));
 
@@ -713,24 +702,24 @@
     expect(
         sliderBox,
         paints
-          ..rrect(color: sliderTheme.disabledActiveTrackColor)
-          ..rrect(color: sliderTheme.disabledInactiveTrackColor));
-    expect(sliderBox, paints..shadow(color: Colors.black)..circle(color: sliderTheme.disabledThumbColor));
+          ..rect(color: sliderTheme.disabledActiveTrackColor)
+          ..rect(color: sliderTheme.disabledInactiveTrackColor));
+    expect(sliderBox, paints..circle(color: sliderTheme.disabledThumbColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
 
     // Test setting the activeColor and inactiveColor for disabled widget.
     await tester.pumpWidget(buildApp(activeColor: customColor1, inactiveColor: customColor2, enabled: false));
     expect(
         sliderBox,
         paints
-          ..rrect(color: sliderTheme.disabledActiveTrackColor)
-          ..rrect(color: sliderTheme.disabledInactiveTrackColor));
-    expect(sliderBox, paints..shadow(color: Colors.black)..circle(color: sliderTheme.disabledThumbColor));
+          ..rect(color: sliderTheme.disabledActiveTrackColor)
+          ..rect(color: sliderTheme.disabledInactiveTrackColor));
+    expect(sliderBox, paints..circle(color: sliderTheme.disabledThumbColor));
     expect(sliderBox, isNot(paints..circle(color: sliderTheme.thumbColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.activeTrackColor)));
-    expect(sliderBox, isNot(paints..rrect(color: sliderTheme.inactiveTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.activeTrackColor)));
+    expect(sliderBox, isNot(paints..rect(color: sliderTheme.inactiveTrackColor)));
 
     // Test that the default value indicator has the right colors.
     await tester.pumpWidget(buildApp(divisions: 3));
@@ -742,15 +731,14 @@
     expect(
       sliderBox,
       paints
-        ..rrect(color: sliderTheme.activeTrackColor)
-        ..rrect(color: sliderTheme.inactiveTrackColor)
+        ..rect(color: sliderTheme.activeTrackColor)
+        ..rect(color: sliderTheme.inactiveTrackColor)
         ..circle(color: sliderTheme.overlayColor)
         ..circle(color: sliderTheme.activeTickMarkColor)
         ..circle(color: sliderTheme.activeTickMarkColor)
         ..circle(color: sliderTheme.inactiveTickMarkColor)
         ..circle(color: sliderTheme.inactiveTickMarkColor)
         ..path(color: sliderTheme.valueIndicatorColor)
-        ..shadow(color: Colors.black)
         ..circle(color: sliderTheme.thumbColor),
     );
     await gesture.up();
@@ -771,16 +759,14 @@
     expect(
       sliderBox,
       paints
-        ..rrect(color: customColor1) // active track
-        ..rrect(color: customColor2) // inactive track
+        ..rect(color: customColor1) // active track
+        ..rect(color: customColor2) // inactive track
         ..circle(color: customColor1.withOpacity(0.12)) // overlay
         ..circle(color: customColor2) // 1st tick mark
         ..circle(color: customColor2) // 2nd tick mark
         ..circle(color: customColor2) // 3rd tick mark
         ..circle(color: customColor1) // 4th tick mark
-        ..path(color: sliderTheme.valueIndicatorColor) // indicator
-        ..shadow(color: Colors.black)
-        ..circle(color: Colors.white)
+        ..path(color: customColor1) // indicator
         ..circle(color: customColor1), // thumb
     );
     await gesture.up();
@@ -984,19 +970,7 @@
     TestGesture gesture = await tester.startGesture(center);
     await tester.pumpAndSettle();
 
-    expect(
-      tester.renderObject(find.byType(Slider)),
-      paints
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(0.0, -38.0),
-            Offset(-30.0, -16.0),
-            Offset(30.0, -16.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        ),
-    );
+    expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 1.0, y: 1.0));
 
     await gesture.up();
     await tester.pumpAndSettle();
@@ -1006,19 +980,7 @@
     gesture = await tester.startGesture(center);
     await tester.pumpAndSettle();
 
-    expect(
-      tester.renderObject(find.byType(Slider)),
-      paints
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(0.0, -52.0),
-            Offset(-44.0, -16.0),
-            Offset(44.0, -16.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        ),
-    );
+    expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 2.0, y: 2.0));
 
     await gesture.up();
     await tester.pumpAndSettle();
@@ -1033,18 +995,7 @@
     gesture = await tester.startGesture(center);
     await tester.pumpAndSettle();
 
-    expect(tester.renderObject(find.byType(Slider)),
-      paints
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(0.0, -38.0),
-            Offset(-30.0, -16.0),
-            Offset(30.0, -16.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        ),
-    );
+    expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 1.0, y: 1.0));
 
     await gesture.up();
     await tester.pumpAndSettle();
@@ -1058,19 +1009,7 @@
     gesture = await tester.startGesture(center);
     await tester.pumpAndSettle();
 
-    expect(
-        tester.renderObject(find.byType(Slider)),
-        paints
-          ..path(
-            includes: const <Offset>[
-              Offset(0.0, 0.0),
-              Offset(0.0, -52.0),
-              Offset(-44.0, -16.0),
-              Offset(44.0, -16.0),
-            ],
-            color: const Color(0xf55f5f5f),
-          ),
-    );
+    expect(tester.renderObject(find.byType(Slider)), paints..scale(x: 2.0, y: 2.0));
 
     await gesture.up();
     await tester.pumpAndSettle();
@@ -1175,11 +1114,11 @@
       expect(
         sliderBox,
         paints
-          ..circle(x: 26.0, y: 24.0, radius: 1.0)
-          ..circle(x: 213.0, y: 24.0, radius: 1.0)
+          ..circle(x: 25.0, y: 24.0, radius: 1.0)
+          ..circle(x: 212.5, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 1.0)
-          ..circle(x: 587.0, y: 24.0, radius: 1.0)
-          ..circle(x: 774.0, y: 24.0, radius: 1.0)
+          ..circle(x: 587.5, y: 24.0, radius: 1.0)
+          ..circle(x: 775.0, y: 24.0, radius: 1.0)
           ..circle(x: 24.0, y: 24.0, radius: 10.0),
       );
 
@@ -1192,11 +1131,11 @@
         sliderBox,
         paints
           ..circle(x: 111.20703125, y: 24.0, radius: 5.687664985656738)
-          ..circle(x: 26.0, y: 24.0, radius: 1.0)
-          ..circle(x: 213.0, y: 24.0, radius: 1.0)
+          ..circle(x: 25.0, y: 24.0, radius: 1.0)
+          ..circle(x: 212.5, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 1.0)
-          ..circle(x: 587.0, y: 24.0, radius: 1.0)
-          ..circle(x: 774.0, y: 24.0, radius: 1.0)
+          ..circle(x: 587.5, y: 24.0, radius: 1.0)
+          ..circle(x: 775.0, y: 24.0, radius: 1.0)
           ..circle(x: 111.20703125, y: 24.0, radius: 10.0),
       );
 
@@ -1212,11 +1151,11 @@
         sliderBox,
         paints
           ..circle(x: 190.0135726928711, y: 24.0, radius: 12.0)
-          ..circle(x: 26.0, y: 24.0, radius: 1.0)
-          ..circle(x: 213.0, y: 24.0, radius: 1.0)
+          ..circle(x: 25.0, y: 24.0, radius: 1.0)
+          ..circle(x: 212.5, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 1.0)
-          ..circle(x: 587.0, y: 24.0, radius: 1.0)
-          ..circle(x: 774.0, y: 24.0, radius: 1.0)
+          ..circle(x: 587.5, y: 24.0, radius: 1.0)
+          ..circle(x: 775.0, y: 24.0, radius: 1.0)
           ..circle(x: 190.0135726928711, y: 24.0, radius: 10.0),
       );
       // Wait for animations to finish.
@@ -1226,11 +1165,11 @@
         sliderBox,
         paints
           ..circle(x: 400.0, y: 24.0, radius: 24.0)
-          ..circle(x: 26.0, y: 24.0, radius: 1.0)
-          ..circle(x: 213.0, y: 24.0, radius: 1.0)
+          ..circle(x: 25.0, y: 24.0, radius: 1.0)
+          ..circle(x: 212.5, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 1.0)
-          ..circle(x: 587.0, y: 24.0, radius: 1.0)
-          ..circle(x: 774.0, y: 24.0, radius: 1.0)
+          ..circle(x: 587.5, y: 24.0, radius: 1.0)
+          ..circle(x: 775.0, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 10.0),
       );
       await gesture.up();
@@ -1239,11 +1178,11 @@
       expect(
         sliderBox,
         paints
-          ..circle(x: 26.0, y: 24.0, radius: 1.0)
-          ..circle(x: 213.0, y: 24.0, radius: 1.0)
+          ..circle(x: 25.0, y: 24.0, radius: 1.0)
+          ..circle(x: 212.5, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 1.0)
-          ..circle(x: 587.0, y: 24.0, radius: 1.0)
-          ..circle(x: 774.0, y: 24.0, radius: 1.0)
+          ..circle(x: 587.5, y: 24.0, radius: 1.0)
+          ..circle(x: 775.0, y: 24.0, radius: 1.0)
           ..circle(x: 400.0, y: 24.0, radius: 10.0),
       );
     }
diff --git a/packages/flutter/test/material/slider_theme_test.dart b/packages/flutter/test/material/slider_theme_test.dart
index 8783b59..0fe0688 100644
--- a/packages/flutter/test/material/slider_theme_test.dart
+++ b/packages/flutter/test/material/slider_theme_test.dart
@@ -107,8 +107,8 @@
     expect(
       sliderBox,
       paints
-        ..rrect(color: sliderTheme.disabledActiveTrackColor)
-        ..rrect(color: sliderTheme.disabledInactiveTrackColor),
+        ..rect(color: sliderTheme.disabledActiveTrackColor)
+        ..rect(color: sliderTheme.disabledInactiveTrackColor),
     );
   });
 
@@ -129,8 +129,8 @@
     expect(
       sliderBox,
       paints
-        ..rrect(color: customTheme.disabledActiveTrackColor)
-        ..rrect(color: customTheme.disabledInactiveTrackColor),
+        ..rect(color: customTheme.disabledActiveTrackColor)
+        ..rect(color: customTheme.disabledInactiveTrackColor),
     );
   });
 
@@ -228,15 +228,13 @@
     await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25));
     final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
 
-    const Radius radius = Radius.circular(2);
-
     // The enabled slider thumb has track segments that extend to and from
     // the center of the thumb.
     expect(
       sliderBox,
       paints
-        ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 298.0, 212.0, 302.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.activeTrackColor)
-        ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 298.0, 776.0, 302.0, topRight: radius, bottomRight: radius), color: sliderTheme.inactiveTrackColor),
+        ..rect(rect: const Rect.fromLTRB(25.0, 299.0, 202.0, 301.0), color: sliderTheme.activeTrackColor)
+        ..rect(rect: const Rect.fromLTRB(222.0, 299.0, 776.0, 301.0), color: sliderTheme.inactiveTrackColor),
     );
 
     await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25, enabled: false));
@@ -251,8 +249,8 @@
     expect(
       sliderBox,
       paints
-        ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 298.0, 212.0, 302.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.disabledActiveTrackColor)
-        ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 298.0, 776.0, 302.0, topRight: radius, bottomRight: radius), color: sliderTheme.disabledInactiveTrackColor),
+        ..rect(rect: const Rect.fromLTRB(25.0, 299.0, 202.0, 301.0), color: sliderTheme.disabledActiveTrackColor)
+        ..rect(rect: const Rect.fromLTRB(222.0, 299.0, 776.0, 301.0), color: sliderTheme.disabledInactiveTrackColor),
     );
   });
 
@@ -366,189 +364,7 @@
       platform: TargetPlatform.android,
       primarySwatch: Colors.blue,
     );
-    final SliderThemeData sliderTheme = theme.sliderTheme.copyWith(
-      thumbColor: Colors.red.shade500,
-      showValueIndicator: ShowValueIndicator.always,
-    );
-    Widget buildApp(String value, { double sliderValue = 0.5, double textScale = 1.0 }) {
-      return Directionality(
-        textDirection: TextDirection.ltr,
-        child: MediaQuery(
-          data: MediaQueryData.fromWindow(window).copyWith(textScaleFactor: textScale),
-          child: Material(
-            child: Row(
-              children: <Widget>[
-                Expanded(
-                  child: SliderTheme(
-                    data: sliderTheme,
-                    child: Slider(
-                      value: sliderValue,
-                      label: '$value',
-                      divisions: 3,
-                      onChanged: (double d) { },
-                    ),
-                  ),
-                ),
-              ],
-            ),
-          ),
-        ),
-      );
-    }
-
-    await tester.pumpWidget(buildApp('1'));
-
-    final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-
-    Offset center = tester.getCenter(find.byType(Slider));
-    TestGesture gesture = await tester.startGesture(center);
-    // Wait for value indicator animation to finish.
-    await tester.pumpAndSettle();
-    expect(
-      sliderBox,
-      paints
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(-20.0, -12.0),
-            Offset(20.0, -34.0),
-            Offset(0.0, -38.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        ),
-    );
-
-    await gesture.up();
-
-    // Test that it expands with a larger label.
-    await tester.pumpWidget(buildApp('1000'));
-    center = tester.getCenter(find.byType(Slider));
-    gesture = await tester.startGesture(center);
-    // Wait for value indicator animation to finish.
-    await tester.pumpAndSettle();
-    expect(
-      sliderBox,
-      paints
-        ..rrect()
-        ..rrect()
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(-30.0, -12.0),
-            Offset(30.0, -34.0),
-            Offset(0.0, -38.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        ),
-    );
-    await gesture.up();
-
-    // Test that it avoids the left edge of the screen.
-    await tester.pumpWidget(buildApp('1000000', sliderValue: 0.0));
-    center = tester.getCenter(find.byType(Slider));
-    gesture = await tester.startGesture(center);
-    // Wait for value indicator animation to finish.
-    await tester.pumpAndSettle();
-    expect(
-      sliderBox,
-      paints
-        ..rrect()
-        ..rrect()
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(-12.0, -12.0),
-            Offset(110.0, -34.0),
-            Offset(0.0, -38.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        )
-    );
-    await gesture.up();
-
-    // Test that it avoids the right edge of the screen.
-    await tester.pumpWidget(buildApp('1000000', sliderValue: 1.0));
-    center = tester.getCenter(find.byType(Slider));
-    gesture = await tester.startGesture(center);
-    // Wait for value indicator animation to finish.
-    await tester.pumpAndSettle();
-    expect(
-      sliderBox,
-      paints
-        ..rrect()
-        ..rrect()
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(-110.0, -12.0),
-            Offset(12.0, -34.0),
-            Offset(0.0, -38.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        )
-    );
-    await gesture.up();
-
-    // Test that the box decreases in height when the text scale gets smaller.
-    await tester.pumpWidget(buildApp('1000000', sliderValue: 0.0, textScale: 0.5));
-    center = tester.getCenter(find.byType(Slider));
-    gesture = await tester.startGesture(center);
-    // Wait for value indicator animation to finish.
-    await tester.pumpAndSettle();
-    expect(
-      sliderBox,
-      paints
-        ..rrect()
-        ..rrect()
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(-12.0, -12.0),
-            Offset(61.0, -16.0),
-            Offset(0.0, -20.0),
-          ],
-          excludes: const <Offset>[
-            Offset(0.0, -38.0)
-          ],
-          color: const Color(0xf55f5f5f),
-        )
-    );
-    await gesture.up();
-
-    // Test that the box increases in height when the text scale gets bigger.
-    await tester.pumpWidget(buildApp('1000000', sliderValue: 0.0, textScale: 2.0));
-    center = tester.getCenter(find.byType(Slider));
-    gesture = await tester.startGesture(center);
-    // Wait for value indicator animation to finish.
-    await tester.pumpAndSettle();
-    expect(
-      sliderBox,
-      paints
-        ..rrect()
-        ..rrect()
-        ..path(
-          includes: const <Offset>[
-            Offset(0.0, 0.0),
-            Offset(-12.0, -16.0),
-            Offset(208.0, -40.0),
-            Offset(0.0, -50.0),
-          ],
-          color: const Color(0xf55f5f5f),
-        )
-    );
-    await gesture.up();
-  }, skip: isBrowser);
-
-  testWidgets('Paddle slider value indicator shape draws correctly', (WidgetTester tester) async {
-    final ThemeData theme = ThemeData(
-      platform: TargetPlatform.android,
-      primarySwatch: Colors.blue,
-    );
-    final SliderThemeData sliderTheme = theme.sliderTheme.copyWith(
-      thumbColor: Colors.red.shade500,
-      showValueIndicator: ShowValueIndicator.always,
-      valueIndicatorShape: const PaddleSliderValueIndicatorShape(),
-    );
+    final SliderThemeData sliderTheme = theme.sliderTheme.copyWith(thumbColor: Colors.red.shade500, showValueIndicator: ShowValueIndicator.always);
     Widget buildApp(String value, { double sliderValue = 0.5, double textScale = 1.0 }) {
       return Directionality(
         textDirection: TextDirection.ltr,
@@ -716,7 +532,6 @@
 
   testWidgets('The slider track height can be overridden', (WidgetTester tester) async {
     final SliderThemeData sliderTheme = ThemeData().sliderTheme.copyWith(trackHeight: 16);
-    const Radius radius = Radius.circular(8);
 
     await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25));
 
@@ -726,8 +541,8 @@
     expect(
       sliderBox,
       paints
-        ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 292.0, 212.0, 308.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.activeTrackColor)
-        ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 292.0, 776.0, 308.0, topRight: radius, bottomRight: radius), color: sliderTheme.inactiveTrackColor),
+        ..rect(rect: const Rect.fromLTRB(32.0, 292.0, 202.0, 308.0), color: sliderTheme.activeTrackColor)
+        ..rect(rect: const Rect.fromLTRB(222.0, 292.0, 776.0, 308.0), color: sliderTheme.inactiveTrackColor),
     );
 
     await tester.pumpWidget(_buildApp(sliderTheme, value: 0.25, enabled: false));
@@ -738,8 +553,8 @@
     expect(
       sliderBox,
       paints
-        ..rrect(rrect: RRect.fromLTRBAndCorners(24.0, 292.0, 212.0, 308.0, topLeft: radius, bottomLeft: radius), color: sliderTheme.disabledActiveTrackColor)
-        ..rrect(rrect: RRect.fromLTRBAndCorners(212.0, 292.0, 776.0, 308.0, topRight: radius, bottomRight: radius), color: sliderTheme.disabledInactiveTrackColor),
+        ..rect(rect: const Rect.fromLTRB(32.0, 292.0, 202.0, 308.0), color: sliderTheme.disabledActiveTrackColor)
+        ..rect(rect: const Rect.fromLTRB(222.0, 292.0, 776.0, 308.0), color: sliderTheme.disabledInactiveTrackColor),
     );
   });
 
@@ -808,9 +623,9 @@
     expect(
       sliderBox,
       paints
-        ..circle(x: 26, y: 300, radius: 5, color: sliderTheme.activeTickMarkColor)
+        ..circle(x: 29, y: 300, radius: 5, color: sliderTheme.activeTickMarkColor)
         ..circle(x: 400, y: 300, radius: 5, color: sliderTheme.activeTickMarkColor)
-        ..circle(x: 774, y: 300, radius: 5, color: sliderTheme.inactiveTickMarkColor),
+        ..circle(x: 771, y: 300, radius: 5, color: sliderTheme.inactiveTickMarkColor),
     );
 
     await tester.pumpWidget(_buildApp(sliderTheme, value: 0.5, divisions: 2,  enabled: false));
@@ -819,9 +634,9 @@
     expect(
       sliderBox,
       paints
-        ..circle(x: 26, y: 300, radius: 5, color: sliderTheme.disabledActiveTickMarkColor)
+        ..circle(x: 29, y: 300, radius: 5, color: sliderTheme.disabledActiveTickMarkColor)
         ..circle(x: 400, y: 300, radius: 5, color: sliderTheme.disabledActiveTickMarkColor)
-        ..circle(x: 774, y: 300, radius: 5, color: sliderTheme.disabledInactiveTickMarkColor),
+        ..circle(x: 771, y: 300, radius: 5, color: sliderTheme.disabledInactiveTickMarkColor),
     );
   });
 
@@ -893,7 +708,7 @@
     final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
 
     // Only 2 track segments.
-    expect(sliderBox, paintsExactlyCountTimes(#drawRRect, 2));
+    expect(sliderBox, paintsExactlyCountTimes(#drawRect, 2));
     expect(sliderBox, paintsExactlyCountTimes(#drawCircle, 0));
     expect(sliderBox, paintsExactlyCountTimes(#drawPath, 0));
   });
@@ -1000,124 +815,34 @@
     await gesture.up();
   });
 
-  testWidgets('PaddleSliderValueIndicatorShape skips all painting at zero scale', (WidgetTester tester) async {
-    // Pump a slider with just a value indicator.
-    await tester.pumpWidget(_buildApp(
-      ThemeData().sliderTheme.copyWith(
-        trackHeight: 0,
-        overlayShape: SliderComponentShape.noOverlay,
-        thumbShape: SliderComponentShape.noThumb,
-        tickMarkShape: SliderTickMarkShape.noTickMark,
-        showValueIndicator: ShowValueIndicator.always,
-        valueIndicatorShape: const PaddleSliderValueIndicatorShape(),
-      ),
-      value: 0.5,
-      divisions: 4,
-    ));
-
-    final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-
-    // Tap the center of the track to kick off the animation of the value indicator.
-    final Offset center = tester.getCenter(find.byType(Slider));
-    final TestGesture gesture = await tester.startGesture(center);
-
-    // Nothing to paint at scale 0.
-    await tester.pump();
-    expect(sliderBox, paintsNothing);
-
-    // Painting a path for the value indicator.
-    await tester.pump(const Duration(milliseconds: 16));
-    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 1));
-
-    await gesture.up();
-  });
-
-  testWidgets('Default slider value indicator shape skips all painting at zero scale', (WidgetTester tester) async {
-    // Pump a slider with just a value indicator.
-    await tester.pumpWidget(_buildApp(
-      ThemeData().sliderTheme.copyWith(
-        trackHeight: 0,
-        overlayShape: SliderComponentShape.noOverlay,
-        thumbShape: SliderComponentShape.noThumb,
-        tickMarkShape: SliderTickMarkShape.noTickMark,
-        showValueIndicator: ShowValueIndicator.always,
-      ),
-      value: 0.5,
-      divisions: 4,
-    ));
-
-    final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
-
-    // Tap the center of the track to kick off the animation of the value indicator.
-    final Offset center = tester.getCenter(find.byType(Slider));
-    final TestGesture gesture = await tester.startGesture(center);
-
-    // Nothing to paint at scale 0.
-    await tester.pump();
-    expect(sliderBox, paintsNothing);
-
-    // Painting a path for the value indicator.
-    await tester.pump(const Duration(milliseconds: 16));
-    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 1));
-
-    await gesture.up();
-  });
-
   testWidgets('PaddleRangeSliderValueIndicatorShape skips all painting at zero scale', (WidgetTester tester) async {
     // Pump a slider with just a value indicator.
-    await tester.pumpWidget(_buildRangeApp(
-      ThemeData().sliderTheme.copyWith(
-        trackHeight: 0,
-        rangeValueIndicatorShape: const PaddleRangeSliderValueIndicatorShape(),
-      ),
-      values: const RangeValues(0, 0.5),
-      divisions: 4,
-    ));
-
-    final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(RangeSlider));
-
-    // Tap the center of the track to kick off the animation of the value indicator.
-    final Offset center = tester.getCenter(find.byType(RangeSlider));
-    final TestGesture gesture = await tester.startGesture(center);
-
-    // No value indicator path to paint at scale 0.
-    await tester.pump();
-    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 0));
-
-    // Painting a path for each value indicator.
-    await tester.pump(const Duration(milliseconds: 16));
-    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 2));
-
-    await gesture.up();
-  });
-
-  testWidgets('Default range indicator shape skips all painting at zero scale', (WidgetTester tester) async {
-    // Pump a slider with just a value indicator.
-    await tester.pumpWidget(_buildRangeApp(
+    await tester.pumpWidget(_buildApp(
       ThemeData().sliderTheme.copyWith(
         trackHeight: 0,
         overlayShape: SliderComponentShape.noOverlay,
         thumbShape: SliderComponentShape.noThumb,
         tickMarkShape: SliderTickMarkShape.noTickMark,
         showValueIndicator: ShowValueIndicator.always,
+        rangeValueIndicatorShape: const PaddleRangeSliderValueIndicatorShape(),
       ),
-      values: const RangeValues(0, 0.5),
+      value: 0.5,
       divisions: 4,
     ));
 
-    final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(RangeSlider));
+    final RenderBox sliderBox = tester.firstRenderObject<RenderBox>(find.byType(Slider));
 
     // Tap the center of the track to kick off the animation of the value indicator.
-    final Offset center = tester.getCenter(find.byType(RangeSlider));
+    final Offset center = tester.getCenter(find.byType(Slider));
     final TestGesture gesture = await tester.startGesture(center);
 
-    // No value indicator path to paint at scale 0.
+    // Nothing to paint at scale 0.
     await tester.pump();
-    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 0));
+    expect(sliderBox, paintsNothing);
 
-    // Painting a path for each value indicator.
+    // Painting a path for the value indicator.
     await tester.pump(const Duration(milliseconds: 16));
-    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 2));
+    expect(sliderBox, paintsExactlyCountTimes(#drawPath, 1));
 
     await gesture.up();
   });
@@ -1146,27 +871,3 @@
     ),
   );
 }
-
-Widget _buildRangeApp(
-    SliderThemeData sliderTheme, {
-      RangeValues values = const RangeValues(0, 0),
-      bool enabled = true,
-      int divisions,
-    }) {
-  final ValueChanged<RangeValues> onChanged = enabled ? (RangeValues d) => values = d : null;
-  return MaterialApp(
-    home: Scaffold(
-      body: Center(
-        child: SliderTheme(
-          data: sliderTheme,
-          child: RangeSlider(
-            values: values,
-            labels: RangeLabels(values.start.toString(), values.end.toString()),
-            onChanged: onChanged,
-            divisions: divisions,
-          ),
-        ),
-      ),
-    ),
-  );
-}
