wave_form_widget.dart 1.98 KB
import 'package:flutter/material.dart';
import 'package:one_key/res/colors.dart';

/**
 * 
 * 
 * WaveformWidget(volume: _volume) // 在录音时传入音量值
 * 
 * 
 */

class WaveformWidget extends StatefulWidget {
  final double volume;

  const WaveformWidget({Key? key, required this.volume}) : super(key: key);

  @override
  _WaveformWidgetState createState() => _WaveformWidgetState();
}

class _WaveformWidgetState extends State<WaveformWidget>
    with SingleTickerProviderStateMixin {
  late AnimationController _controller;
  List<double> _waveData = List.generate(20, (index) => 0.0); // 存储波形数据

  @override
  void initState() {
    super.initState();
    _controller = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 100),
    )..repeat();
  }

  @override
  void didUpdateWidget(WaveformWidget oldWidget) {
    super.didUpdateWidget(oldWidget);
    // 更新波形数据
    _waveData.removeAt(0);
    _waveData.add(widget.volume);
  }

  @override
  Widget build(BuildContext context) {
    return AnimatedBuilder(
      animation: _controller,
      builder: (context, child) {
        return CustomPaint(
          painter: WaveformPainter(_waveData),
          size: Size(300, 100),
        );
      },
    );
  }
}

class WaveformPainter extends CustomPainter {
  final List<double> waveData;

  WaveformPainter(this.waveData);

  @override
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = MyColours.color_438E93
      ..strokeWidth = 2
      ..style = PaintingStyle.stroke;

    final path = Path();
    final xStep = size.width / (waveData.length - 1);

    for (int i = 0; i < waveData.length; i++) {
      final x = i * xStep;
      final y = size.height / 2 + waveData[i] * 10; // 调整振幅

      if (i == 0) {
        path.moveTo(x, y);
      } else {
        path.lineTo(x, y);
      }
    }

    canvas.drawPath(path, paint);
  }

  @override
  bool shouldRepaint(covariant CustomPainter oldDelegate) => true;
}