61 lines
1.9 KiB
Dart
61 lines
1.9 KiB
Dart
import 'package:ai_chat_assistant/utils/assets_util.dart';
|
||
import 'package:flutter/material.dart';
|
||
import 'mini_audio_wave.dart';
|
||
|
||
/// 浮动图标与声波动画组合组件
|
||
///
|
||
/// 将ai_hd_clean.png图片和AudioWaveLargeMini声波效果组合成一个独立组件
|
||
class FloatingIconWithWave extends StatelessWidget {
|
||
/// 动画控制器,用于驱动声波动画
|
||
final AnimationController animationController;
|
||
|
||
/// 图标大小
|
||
final double iconSize;
|
||
|
||
/// 声波颜色,默认为白色
|
||
final Color waveColor;
|
||
|
||
/// 构造函数
|
||
const FloatingIconWithWave({
|
||
super.key,
|
||
required this.animationController,
|
||
required this.iconSize,
|
||
this.waveColor = Colors.white,
|
||
});
|
||
|
||
@override
|
||
Widget build(BuildContext context) {
|
||
return SizedBox(
|
||
width: iconSize,
|
||
height: iconSize,
|
||
child: Stack(
|
||
alignment: Alignment.center,
|
||
children: [
|
||
// 背景图片
|
||
AssetsUtil.getImageWidget(
|
||
'ai_hd_clean.png',
|
||
width: iconSize,
|
||
height: iconSize,
|
||
fit: BoxFit.contain,
|
||
),
|
||
// 声波动画,距离底部13px的位置
|
||
Positioned(
|
||
bottom: 13 * (iconSize / 198), // 按比例计算距离底部的位置
|
||
child: SizedBox(
|
||
width: 96 * (iconSize / 144), // 最宽不超过96px(按图片原始宽度比例)
|
||
height: 27 * (iconSize / 198), // 最高不超过27px(按图片原始高度比例)
|
||
child: AudioWaveLargeMini(
|
||
animationController: animationController,
|
||
waveColor: waveColor,
|
||
barSpacing: 2.5, // 减小间距以适应更小的宽度
|
||
minHeightRatio: 0.4, // 调整最小高度比例
|
||
maxHeightRatio: 1.0, // 保持最大高度比例
|
||
),
|
||
),
|
||
),
|
||
],
|
||
),
|
||
);
|
||
}
|
||
}
|