import 'package:flutter/material.dart'; import 'dart:math' as math; /// 大型音频波形动画组件 /// /// 用于显示适合主按钮的波形动画,竖线数量根据总宽度自动计算 class AudioWaveLarge extends StatelessWidget { /// 动画控制器,用于驱动波形动画 final AnimationController animationController; /// 波形颜色,默认为白色 final Color waveColor; /// 波形条间距,默认为4.0px final double barSpacing; /// 总宽度,默认为148.0px final double totalWidth; /// 最大高度,默认为22.0px final double maxHeight; /// 最小高度,默认为4.0px final double minHeight; /// 构造函数 const AudioWaveLarge({ super.key, required this.animationController, this.waveColor = Colors.white, this.barSpacing = 4.0, this.totalWidth = 148.0, this.maxHeight = 22.0, this.minHeight = 4.0, }); @override Widget build(BuildContext context) { return AnimatedBuilder( key: const Key('audioWaveAnimation'), // 为音频波形添加key便于引用 animation: animationController, builder: (context, child) { // 根据总宽度动态计算竖线数量 // 每个竖线宽度2px + 间距,保持合理的密度 final barWidthWithSpacing = 2 + barSpacing; final dynamicBarCount = (totalWidth / barWidthWithSpacing).floor(); final actualBarCount = dynamicBarCount > 0 ? dynamicBarCount : 1; return SizedBox( width: totalWidth, // 设置动态宽度 height: maxHeight, // 设置固定高度 child: Row( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, // 垂直居中 children: List.generate(actualBarCount, (index) { // 为每个竖线创建不同的相位,使动画不同步 final phase = index * 0.3; // 设置不同的频率增加自然变化 final frequency = 1.0 + (index % 3) * 0.2; // 计算波形高度 final height = minHeight + (maxHeight - minHeight) * math.sin( (animationController.value * 2 * math.pi * frequency) + phase ).abs(); // 构建单个波形条 return Padding( padding: EdgeInsets.symmetric(horizontal: barSpacing / 2), // 左右间距 child: Container( width: 2, // 波形条宽度2px height: height, // 高度随动画变化 decoration: BoxDecoration( color: waveColor, borderRadius: BorderRadius.circular(2), // 圆角效果 ), ), ); }), ), ); }, ); } }