1

每次按下按钮时,我的应用都会播放硬币声音。

coin_sound.start();

您可以轻松地按比硬币声音更快的速度。发生这种情况时,我希望每次按下按钮时硬币声音都从头开始。

if(coin_sound.isPlaying()){
    coin_sound.reset();
    coin_sound = MediaPlayer.create(getContext(), R.raw.coin02);
}
coin_sound.start();

这样做的问题是,加载一个很小的媒体文件仍然是一个相对缓慢的过程。当您开始真正快速地单击按钮时,应用程序会严重滞后。

我的问题有什么解决方案吗?我唯一的想法是用一系列 coin_sounds 做一些事情,但这种方法看起来会很混乱和恶心......

4

2 回答 2

1

此处发布的另一个答案有些正确。你不应该create一遍又一遍地打电话。

但是,该答案中的代码有问题。该reset方法将其发送MediaPlayer到空闲状态,在这种状态下调用大多数其他方法是非法的。如果你要走那条路,你必须按以下顺序调用方法:

coin_sound.reset();
coin_sound.setDataSource(...);
coin_sound.prepare();
coin_sound.start();

调用与之前的方法调用序列之间的区别create只是创建了一个新实例。然而,这并不是做应该做的事情的最快方法。

coin_sound.seekTo(0);当您希望当前播放的声音重新开始时,您应该简单地调用。所以做类似的事情:

if (coin_sound.isPlaying()) coin_sound.seekTo(0);
else coin_sound.start();

假设您已将其留MediaPlayer在准备状态,因此start可以调用。您可以通过在侦听器中调用resetsetDataSource和来完成此操作。此外,请确保在不再需要声音时拨打电话。prepareonCompletionrelease

于 2013-10-12T09:45:10.673 回答
0

这是因为您在按钮单击事件中启动 coin_sound,试试这个

在您的 oncreate 方法中启动此变量

coin_sound = MediaPlayer.create(getContext(), R.raw.coin02);

然后将此作为您的按钮的代码

if(coin_sound.isPlaying()){
coin_sound.reset();
}
coin_sound.start();

问题是每次单击按钮时您都在重新创建一个新的媒体播放器,所以新的媒体播放器不认为有声音

你需要重新开始coin_sound.start();吗?不重新启动停止然后为您启动声音?

于 2013-10-12T04:48:32.500 回答