Flutter - индикатор значения настраиваемого слайдера. Как получить центральное положение слайдера

Я пытаюсь реализовать собственный индикатор прогресса для ползунка флаттера. А пока у меня есть код, который рисует индикатор.

class InsideSliderValueIndicator extends SliderComponentShape {
  @override
  Size getPreferredSize(bool isEnabled, bool isDiscrete) {
    return Size.zero;
  }

  @override
  void paint(
    PaintingContext context,
    Offset center, {
    Animation<double> activationAnimation,
    Animation<double> enableAnimation,
    bool isDiscrete,
    TextPainter labelPainter,
    RenderBox parentBox,
    SliderThemeData sliderTheme,
    TextDirection textDirection,
    double value,
  }) {
    final sliderWidth = parentBox.size.width;
    final sliderBoxOffset = parentBox.localToGlobal(Offset.zero);
    labelPainter.paint(
        context.canvas,
        Offset(sliderBoxOffset.dx  + sliderWidth / 2 - labelPainter.width / 2,
            center.dy - labelPainter.height / 2));
  }
}

Я также настроил ползунок, чтобы убрать большой палец. Вот как это выглядит:

Как видите, текст на ползунке не центрируется.

Проблема с этим кодом в том, что sliderBoxOffset не возвращает коробку "ползунка", а родительскую карту, и center на самом деле положение вашего большого пальца на слайдере относительно родителя.

Итак, мой вопрос: как я могу получить центр ползунка по заданным параметрам?

Спасибо за помощь

1 ответ

Я нашел странное решение, которое подходит для моего варианта использования

    final sliderWidth = parentBox.size.width;
    final halfSliderWidth = sliderWidth / 2;
    final translateX = value < 0.5 ? halfSliderWidth - (value * sliderWidth) : halfSliderWidth - (value * sliderWidth);
    labelPainter.paint(context.canvas, center.translate(translateX - labelPainter.width / 2, -labelPainter.height / 2));

Однако я уверен, что это не сработает, если ползунок не отцентрован в своем родителе. Мне все еще интересно, есть ли менее грязный способ сделать это.

Другие вопросы по тегам