我有两个按钮(一个用于成功,另一个用于失败)。我想在单击每个按钮时重现不同的声音。在销毁当前 Activity 之前,每个按钮都会被点击 100 次。
如果在单击任何按钮时播放两种声音,我想中断它们,以避免同时听到两种声音。为此,我创建了一个名为
stopSounds()
的函数,单击任何按钮时都会调用该函数。
此外,我在销毁 Activity 时释放了两种声音。我是否应该在应用程序的其他部分释放它们,例如每次它们玩完时?
这是我的代码摘要:
class MyClass : AppCompatActivity() {
private var successSound: MediaPlayer? = null
private var failSound: MediaPlayer? = null
override fun onDestroy() {
super.onDestroy()
this.successSound.release()
this.failSound.release()
}
override fun onCreate() {
super.onCreate()
...
val successBtn = findViewById<Button>(R.id.btn_success)
val failBtn = findViewById<Button>(R.id.btn_fail)
...
this.successSound = MediaPlayer.create(this, R.raw.success)
this.failSound = MediaPlayer.create(this, R.raw.fail)
...
successBtn.setOnClickListener {
this.stopSounds()
this.successSound!!.start()
}
failBtn.setOnClickListener {
this.stopSounds()
this.failSound!!.start()
}
}
private fun stopSounds() {
if (this.successSound?.isPlaying == true) {
this.successSound!!.stop()
this.successSound!!.prepare()
}
if (this.failSound?.isPlaying == true) {
this.failSound!!.stop()
this.failSound!!.prepare()
}
}
}
可以吗?我可以改进吗?我应该使用 SoundPool 吗?任何建议、更正或示例将不胜感激。预先感谢您。
是的,SoundPool似乎是此用例的首选选项。
短声音可以预先解码到内存中,从而实现低延迟播放。
您可以使用一个
SoundPool
实例(播放多种声音)而不是多个 MediaPlayer
实例。这简化了错误处理和状态管理。
每个
MediaPlayer
都保存数据源的文件描述符。应用程序可以保存的打开文件描述符的数量存在硬编码限制。如果您播放大量声音,这一点很重要。