Media3 ExoPlayer自定义控制视图播放暂停按钮失效并排显示问题
解决Media3迁移后自定义控制视图播放/暂停按钮异常问题
方案一:使用Media3内置的PlayPauseButton(推荐)
Media3的播放器控制逻辑中,推荐使用统一的PlayPauseButton控件处理播放/暂停状态切换——它内部已封装状态监听、显示切换和点击事件逻辑,可完全替代原分开的exo_play和exo_pause按钮。
修改你的player_control_view布局,将原来的两个ImageButton替换为:
<androidx.media3.ui.PlayPauseButton android:id="@id/exo_play_pause" android:layout_width="100dp" android:layout_marginLeft="@dimen/player_control_play_pause_margin" android:layout_marginRight="@dimen/player_control_play_pause_margin" style="@style/PlayerControlButtonBaseStyle.PlayPauseButton" />
同时在样式中定义PlayPauseButton的播放/暂停状态图标:
<style name="PlayerControlButtonBaseStyle.PlayPauseButton" parent="Widget.Media3.PlayPauseButton"> <item name="android:src">@drawable/ic_play</item> <item name="pauseDrawable">@drawable/ic_pause</item> </style>
设置完成后,控件会自动根据Player的播放状态切换图标,点击事件也会自动绑定对应操作,无需额外代码处理。
方案二:手动维护独立的播放/暂停按钮(不推荐)
若必须保留分开的exo_play和exo_pause按钮,需手动绑定Player状态监听与点击事件:
- 获取Player和按钮引用:
val playerView = findViewById<PlayerView>(R.id.player_view) val playButton = playerView.findViewById<ImageButton>(androidx.media3.ui.R.id.exo_play) val pauseButton = playerView.findViewById<ImageButton>(androidx.media3.ui.R.id.exo_pause) val player = playerView.player
- 监听Player状态,控制按钮显示/隐藏:
player?.addListener(object : Player.Listener { override fun onIsPlayingChanged(isPlaying: Boolean) { playButton.visibility = if (isPlaying) View.GONE else View.VISIBLE pauseButton.visibility = if (isPlaying) View.VISIBLE else View.GONE } })
- 绑定点击事件:
playButton.setOnClickListener { player?.play() } pauseButton.setOnClickListener { player?.pause() }
注意初始化时要根据Player的初始状态设置按钮可见性。
问题原因
从ExoPlayer2迁移到Media3后,PlayerControlView对独立的exo_play和exo_pause按钮的自动关联逻辑已调整,不再默认处理这两个按钮的状态切换与事件绑定,而是推荐使用统一的PlayPauseButton简化控制逻辑。
内容的提问来源于stack exchange,提问作者Simran Thakkar
相关产品推荐
相关产品推荐

