Пользовательский рисовальщик, рисующий за пределами экрана для новых входящих данных?

Я реализую визуализацию сигналов для микрофона в своем приложении.

      class BarVisualizer extends CustomPainter {
  final List<double> waveData;
BarVisualizer({
    required this.waveData,
});
 @override
  void paint(Canvas canvas, Size size) {
    for (var i = 0; i < waveData.length; i++) {
    canvas.drawLine(Offset(i.toDouble() + i  , 0),
          Offset(i.toDouble() +  i, -waveData[i]), wavePaint);     
    }
  }
@override
  bool shouldRepaint(CustomPainter oldDelegate) {
    return true;
  }

выше рисует линии для каждого значения децибел, которое я получаю от микрофона. Поскольку я использую микрофон для получения данных, список децибел станет большим, и он начнет рисовать за пределами экрана.

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

2 ответа

что я сделал, так это создал обратный вызов, когда определенное условие соответствует, и вызвал setState из этого вызова обратно к смещению, которое выглядит следующим образом:

      for (var i = 0; i < waveData.length; i++) {
if ((spacing * i) + offset.dx > size.width * sizeCounter) {
          callback();
        }
        canvas.drawLine(
            Offset(-scrollOffset.dx + offset.dx + (spacing * i), 100),
            Offset(-scrollOffset.dx + offset.dx + (spacing * i),
                -waveData[i] + 100),
            wavePaint);
      }

теперь в пользовательском интерфейсе,

      CustomPaint(
     painter: Barpainter(
              callback:(){
                WidgetsBinding.instance!.addPostFrameCallback(
                                  (timeStamp) {
                                setState(
                                      () {
                                    scrollOffset +=  Offset(width, 0);
                                    sizeCounter++;
                                  },
                                );
                              },
                            );
       }
  )
)

это добавляет дополнительное смещение, когда оно достигает конца экрана

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

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