当前位置: 首页 > 知识库问答 >
问题:

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

岑毅庵
2023-03-14

我有一个按钮,我想用这个按钮控制多个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列表和一个按钮

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

当按下按钮时,我希望MediaPlayer的以下行为:

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

共有1个答案

傅英喆
2023-03-14
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
    }
}
 类似资料:
  • 本文向大家介绍Android仿音乐播放器带进度的播放暂停按钮,包括了Android仿音乐播放器带进度的播放暂停按钮的使用技巧和注意事项,需要的朋友参考一下 因为项目需要,要做一个下载暂停开始的按钮,要求按钮上显示进度。网上找了找没有合适的,不太满意,于是自己动手写了一个。 效果如下: 主要步骤: 1、最外侧的圆环。 2、圆环内侧代表进度的圆弧。 3、暂停时在中心部位画出三角形。 4、播放时在中心部

  • 我正在使用MediaController.MediaPlayerControl以便在自定义视图的底部显示MediaController,但无法使其正常工作。当我第一次播放音乐时,应该有暂停按钮可见,但相反,有播放,当我按下那个按钮时,音乐被正确暂停,状态保持不变,之后它正常工作。此外,当我播放下一首歌曲时,旧的MediaController小部件与新的小部件重叠。有时,当音乐播放时,进度/搜索栏不

  • 我已经建立了我的音乐列表(RecyclerView)中的每一项都有两个按钮,第一个播放音乐,第二个暂停停止,但当我点击播放两个音频时,两个启动,而我希望第一个停止。这是我的适配器(标志是在播放音频时将图像视图从播放更改为暂停) 非常感谢。

  • 我创建的Android应用程序包含2个按钮,点击每个按钮播放mp3文件。问题是,当我播放按钮1时,它播放声音1,当我单击按钮2时,它播放声音2。 我检查其他玩家的每个按钮是否正常工作,然后停止并播放单击的按钮 但是,如果我两次单击同一个按钮,则会将第一个音频保持在后台播放,然后再次播放另一个音频 我试图检查并停止它,但它不起作用! 我想,如果我点击按钮1,它将播放声音,如果再次点击它,它将停止播放