import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import '../controllers/voice_input_controller.dart'; class VoiceInputPanel extends GetView { const VoiceInputPanel({ Key? key, required this.onRecordingResult, required this.onClose, required this.onRecognizing, }) : super(key: key); final Function(String) onRecordingResult; final VoidCallback onClose; final Function(String) onRecognizing; @override Widget build(BuildContext context) { return Container( decoration: const BoxDecoration( gradient: LinearGradient( begin: Alignment.topCenter, end: Alignment.bottomCenter, colors: [ Color(0xFFFFFFFF), // 纯白色开始 Color(0xFFE8D5F5), // 更深的紫色结束 ], stops: [0.3, 1.0], // 调整颜色分布,让白色占据更多空间 ), ), child: SafeArea( child: Container( height: 120.h, child: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ // 主要内容:麦克风图标、音频波形、关闭按钮 Padding( padding: EdgeInsets.symmetric(horizontal: 20.w), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, crossAxisAlignment: CrossAxisAlignment.center, children: [ // 左侧麦克风图标 Container( width: 60.w, height: 60.w, decoration: BoxDecoration( color: Colors.white, shape: BoxShape.circle, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, spreadRadius: 1, ), ], ), child: Center( child: Icon( Icons.mic, color: Colors.purple.shade300, size: 28.sp, ), ), ), // 中间音频波形 Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.center, children: [ _buildAudioWaveform(), SizedBox(height: 10.h), // 文字提示 Text( '你可以开始说话', style: TextStyle( fontSize: 16.sp, color: Colors.grey.shade700, fontWeight: FontWeight.w500, ), ), ], ), // 右侧关闭按钮 Container( width: 60.w, height: 60.w, decoration: BoxDecoration( color: Colors.white, shape: BoxShape.circle, boxShadow: [ BoxShadow( color: Colors.black.withOpacity(0.05), blurRadius: 10, spreadRadius: 1, ), ], ), child: Center( child: IconButton( icon: Icon( Icons.close, color: Colors.grey.shade600, size: 28.sp, ), onPressed: onClose, padding: EdgeInsets.zero, ), ), ), ], ), ), // 底部进度条 Padding( padding: EdgeInsets.only(top: 15.h), child: Container( width: 250.w, height: 4.h, decoration: BoxDecoration( color: Colors.purple.withOpacity(0.2), borderRadius: BorderRadius.circular(2.r), ), ), ), ], ), ), ), ), ); } Widget _buildAudioWaveform() { return Obx(() { // 根据控制器状态动态生成波形高度 return Row( mainAxisSize: MainAxisSize.min, children: List.generate( 11, (index) { // 创建随机高度效果,模拟声波 double height = controller.isRecording.value ? (4 + (index % 3) * 3).h // 当正在录音时显示不同高度 : 4.h; // 默认高度 return Container( width: 4.w, height: height, margin: EdgeInsets.symmetric(horizontal: 2.w), decoration: BoxDecoration( color: controller.isRecording.value ? Colors.purple.shade300 // 录音时使用紫色 : Colors.grey.shade400, // 默认使用灰色 borderRadius: BorderRadius.circular(2.r), ), ); }, ), ); }); } }