【发布时间】:2019-05-30 12:01:29
【问题描述】:
我对编程非常陌生,尤其是颤振。我想写一个音板,基本上是一个按钮列表,每个按钮的工作是在按下它们时播放我在 PC 上的声音。我已经用列表视图和一些材质按钮完成了设计,但我不知道如何让它们在按下它们时播放声音。有人可以帮我吗?
【问题讨论】:
我对编程非常陌生,尤其是颤振。我想写一个音板,基本上是一个按钮列表,每个按钮的工作是在按下它们时播放我在 PC 上的声音。我已经用列表视图和一些材质按钮完成了设计,但我不知道如何让它们在按下它们时播放声音。有人可以帮我吗?
【问题讨论】:
将audioplayers 添加为依赖项并将您的音频文件添加到pubspec.yaml 文件中,如下所示:
dependencies:
audioplayers: any
flutter:
assets:
- assets/audio/my_audio.mp3
完整代码(Null 安全):
class _HomePageState extends State<HomePage> {
late final AudioCache _audioCache;
@override
void initState() {
super.initState();
_audioCache = AudioCache(
prefix: 'audio/',
fixedPlayer: AudioPlayer()..setReleaseMode(ReleaseMode.STOP),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: ElevatedButton(
onPressed: () => _audioCache.play('my_audio.mp3'),
child: Text('Play'),
),
);
}
}
【讨论】:
import 'package:audioplayers/audio_cache.dart'; 在文件顶部。
如果您只想在有人按下按钮时播放音乐,那么您可以按照以下步骤操作:-
1.添加依赖
dependencies:
audioplayers: ^0.10.0
然后在你的终端中运行以下命令来获取新添加的包-
flutter packages get
2。将其导入 main.dart 或您要使用的文件中。
import 'package:audioplayers/audio_cache.dart';
您可以导入两个类 AudioPlayer 或 AudioCache 并使用 AudioCache 播放本地文件。
3.创建 AudioCache 的对象
final player = AudioCache();
4.使用 play() 方法播放音频
player.play('note1.wav');
注意 - note1.wav 存储在我的主目录的 assets 文件夹中,使用 play() 方法时无需提及。 p>
示例代码 -
import 'package:audioplayers/audio_cache.dart';
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
final player = AudioCache();
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
body: SafeArea(
child: FlatButton(
child: Text("play "),
onPressed: () {
player.play('note1.wav');
},
),
),
),
);
}
}
【讨论】:
对于任何需要播放“点击”声音的人:
import 'package:flutter/services.dart';
SystemSound.play(SystemSoundType.click);
【讨论】:
对于重复的声音,我推荐soundpool 包。
根据我的经验,它提供了更好的延迟,即触发动作和实际声音播放之间的延迟更低。
这是代码示例(从包的自述文件中复制):
import 'package:soundpool/soundpool.dart';
Soundpool pool = Soundpool(streamType: StreamType.notification);
int soundId = await rootBundle.load("sounds/dices.m4a").then((ByteData soundData) {
return pool.load(soundData);
});
int streamId = await pool.play(soundId);
【讨论】:
首先,您必须在主项目文件夹名称中创建一个目录作为存储所有音乐的“资产”。我有 7 首音乐,比如 note1.wav、note2.wav ..... note7.wav。
资产
assets:
- assets/
依赖关系,
dependencies:
audioplayers: ^0.10.0
main.dart 代码
import 'package:audioplayers/audio_cache.dart';
import 'package:flutter/material.dart';
void main() => runApp(Xylophone());
class Xylophone extends StatefulWidget {
@override
_XylophoneState createState() => _XylophoneState();
}
class _XylophoneState extends State<Xylophone> {
// music play sound number function, like note1.wav, note2.wav etc.
void playSound(int number){
final player = AudioCache();
player.play('note$number.wav');
}
// Expanded Widget Function Used for repeated Code
Expanded buildKey(int soundNum, Color color){
return Expanded(
child: FlatButton(
color: color,
onPressed: (){
playSound(soundNum);
},
child: Text(""),
),
);
}
@override
Widget build(BuildContext context) {
// var buttonHeight = MediaQuery.of(context).size.height/2;
return MaterialApp(
debugShowCheckedModeBanner: false,
home: SafeArea(
child: Scaffold(
body: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
buildKey(1, Colors.red),
buildKey(2, Colors.green),
buildKey(3, Colors.blue),
buildKey(4, Colors.deepPurpleAccent),
buildKey(5, Colors.redAccent),
buildKey(6, Colors.black54),
buildKey(7, Colors.pink),
],
),
),
),
);
}
}
【讨论】: