如何用一个按钮暂停/播放多个MediaPlayer对象



我有一个按钮,我想用这个按钮控制多个MediaPlayer对象例如,用户从列表中选择了3个声音,当他们播放时,用户单击暂停图标按钮,所有声音都应该暂停(暂停按钮的资源应该更改为播放图标(。如果用户再次点击播放图标,所有声音都应该继续。

如果我删除代码中的其他部分,我可以实现当前正在播放的暂停声音,但如果我再次单击播放按钮,声音将不会播放,也不会发生任何事情。

我的XML:

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageButton
android:id="@+id/stop_all_sound"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/transparent"
android:src="@drawable/pause_button" />
</LinearLayout>

我的代码:

stop_all_sound.setOnClickListener {
// List of sounds
val list = arrayListOf(sound1, sound2, sound3, sound4)
// List for playing sounds
val playingSounds = arrayListOf<MediaPlayer>()
list.forEach { sound ->
if (sound.isPlaying) {
// If sound is playing add it to the playingSounds list
playingSounds.add(sound)
for (playingSound in playingSounds) {
// Pause that playing sounds currently
playingSound.pause()
stop_all_sound.setImageResource(R.drawable.play_button)
}
}
// I couldn't figured out this part. I guess playingSounds list is empty
else {
for (playingSound in playingSounds) {
playingSound.start()
stop_all_sound.setImageResource(R.drawable.pause_button)
}
}
}
}

更新

为了更清楚,假设有一个MediaPlayerButton的列表

  • 如果没有MediaPlayer处于播放状态,则Button的图标将为播放按钮,否则为pause_button

当按下Button时,我想要MediaPlayers的以下行为:

  • 如果noMediaPlayer正在播放并且noMediaPlayer处于暂停状态,则所有MediaPlayer都将开始播放
  • 如果没有MediaPlayer正在播放,并且某些Media Player处于暂停状态,则所有暂停的MediaPlayer都将开始播放
  • 如果某些MediaPlayer正在播放,而没有Media Player处于暂停状态,则所有正在播放的MediaPlayer都将暂停

更新的答案

var buttonIcon: Int = R.drawable.play_button
val playList = PlayList { isPlaying ->
buttonIcon =
if (isPlaying) R.drawable.pause_button
else R.drawable.play_button
stop_all_sound.setImageResource(buttonIcon)
}
stop_all_sound.setOnClickListener {
// List of sounds
val list = arrayListOf(sound1, sound2, sound3, sound4)
if (playList.isEmpty()) {
buttonIcon = R.drawable.play_button
list.forEach { sound ->
if (sound.isPlaying) {
playList.add(sound)
buttonIcon = R.drawable.pause_button
}
}
if (playList.isEmpty()) list.forEach { playList.add(it) }
}
when (buttonIcon) {
R.drawable.play_button -> playList.play()
R.drawable.pause_button -> playList.pause()
}
}
// PlayList class
class PlayList(private val playingState: (Boolean) -> Unit) {
private val soundList = mutableListOf<MediaPlayer>()
fun isEmpty() = soundList.isEmpty()
fun add(sound: MediaPlayer) {
sound.setOnCompletionListener {
soundList.remove(it)
if (soundList.isEmpty()) playingState(false)
}
soundList.add(sound)
}
fun play() {
soundList.forEach {
it.start()
}
playingState(true)
}
fun pause() {
soundList.forEach {
if (it.isPlaying) it.pause()
}
playingState(false)
}
}

初步答复

,我可以从你的问题中找出以下测试用例

  1. 用户选择歌曲列表
  2. 如果没有播放歌曲,用户按下"播放/暂停"按钮可播放所有选定的歌曲
  3. 用户按下播放/暂停按钮可停止当前正在播放的所有歌曲

在上述情况下,我可能会执行以下操作:

var buttonIcon = R.drawable.play_button
val playList = PlayList(arrayListOf(sound1, sound2, sound3, sound4)) { isPlaying ->
if (isPlaying) {
buttonIcon = R.drawable.pause_button
stop_all_sound.setImageResource(buttonIcon)
} else {
buttonIcon = R.drawable.play_button
stop_all_sound.setImageResource(buttonIcon)
}
}
stop_all_sound.setOnClickListener {
when(buttonIcon) {
R.drawable.play_button -> playList.play()
R.drawable.pause_button -> playList.pause()
}
}

PlayList

class PlayList(
private val soundList: List<MediaPlayer>,
private val playingState: (Boolean) -> Unit
) {
private var nowPlayingCount = 0
init {
soundList.forEach {
it.setOnCompletionListener {
nowPlayingCount = nowPlayingCount.dec()
if (nowPlayingCount == 0) playingState(false)
}
}
}
fun play() {
soundList.forEach {
it.start()
}
playingState(true)
nowPlayingCount = soundList.size
}
fun pause() {
soundList.forEach {
if (it.isPlaying) it.pause()
}
playingState(false)
nowPlayingCount = 0
}
}

最新更新