Как приостановить / воспроизвести несколько объектов MediaPlayer с помощью одной кнопки? - PullRequest
0 голосов
/ 27 октября 2019

У меня есть кнопка, и я хочу управлять несколькими объектами 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)
                }
            }
        }
    }

Обновление

Кчтобы было более понятно, скажем, есть список MediaPlayer и Button

  • Если MediaPlayer не находится в состоянии воспроизведения, значок Button будет play_button, в противном случае pause_button

Мне нужно следующее поведение MediaPlayer с при нажатии Button:

  • Если нет MediaPlayer воспроизводится и нет MediaPlayer находится в состоянии паузы, все MediaPlayer начнет воспроизведение
  • Если no MediaPlayer воспроизводится и некоторые MediaPlayer находится в состоянии паузы, все приостановленные MediaPlayer начнут воспроизводиться
  • Если некоторые MediaPlayer воспроизводится и no MediaPlayer находится в состоянии паузы, все воспроизводимые MediaPlayer будут приостановлены

1 Ответ

0 голосов
/ 27 октября 2019

Обновленный ответ

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
    }
}
...