按下按钮时播放声音

时间:2019-05-30 12:01:30

标签: flutter dart

我对编程非常陌生,尤其是颤抖。我想写一个音板,基本上是一个按钮列表,每个按钮的工作是在按下PC时播放我的PC上的声音。我已经使用列表视图和一些材质按钮完成了设计,但是我不知道如何在按下它们时使它们播放声音。有人可以帮我吗?

5 个答案:

答案 0 :(得分:2)

如果您只想在有人按下按钮时播放音乐,则可以按照以下步骤操作:-

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()方法时无需提及它。

示例代码-

    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');
                },
              ),
            ),
          ),
        );
      }
    }

答案 1 :(得分:1)

首先,您必须在主项目文件夹名称中创建一个目录,作为存储所有音乐的“资产”。我有 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),
            ],
          ),
        ),
      ),
    );
  }
}

答案 2 :(得分:0)

在Android中,MediaPlayer类可以提供帮助。您可以从here

中找到有关它的更多详细信息

将要播放的声音放入资源中。然后,在下面的代码。我创建了一个名为raw的新文件夹,其中包含我所有的声音文件。您可以添加自己的。

MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.yourSoundName);
            mediaPlayer.setLooping(true);
            mediaPlayer.start();

答案 3 :(得分:0)

完整代码

void main() => runApp(HomePage());

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  AudioCache _audioCache;

  @override
  void initState() {
    super.initState();
    // create this only once
    _audioCache = AudioCache(prefix: "audio/", fixedPlayer: AudioPlayer()..setReleaseMode(ReleaseMode.STOP));
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("Music play")),
        body: RaisedButton(
          onPressed: () => _audioCache.play('my_audio.mp3'),
          child: Text("Play Audio"),
        ),
      ),
    );
  }
}

  1. 在您的pubspec.yaml文件audioplayers: any中添加依赖项。
  2. 在您的pubspec.yaml文件中添加音频文件。

    资产:     -资产/audio/my_audio.mp3

  3. 运行flutter packages get

答案 4 :(得分:0)

对于重复的声音,我建议使用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);