根据 ExoPlayer 播放音频位置更新 Jetpack Compose Slider Progress
Update Jetpack Compose Slider Progress based on ExoPlayer playing audio position
我已经为音频文件播放器创建了自定义 UI,我正在使用 Exoplayer 获取文件并播放它。我没有为 exoplayer 使用自定义控制器,我的 UI 有一个需要根据当前音频位置更新的滑块。我怎样才能做到这一点?请帮忙。
var currentValue by remember { mutableStateOf(0f) }
currentValue = mediaPlayer.getCurrentPosition()
Slider(
modifier = Modifier.weight(1f),
value = currentValue ,
onValueChange = {currentValue = it },
valueRange = 0f.. mediaPlayer.contentDuration()
)
根据您的代码,您希望 mediaPlayer.getCurrentPosition()
以某种方式触发重组。
Compose 只能跟踪 State
对象更改,这是一种为触发重组而创建的特殊类型。
当您需要使用一些非Compose 库时,您需要搜索跟踪更改的方法。在大多数旧图书馆中,都有一些针对这种情况的听众。
在 ExoPlayer
的情况下没有直接的监听器。在此 issue you can see suggestion to use the listener to track isPlaying
state. In Compose to work with listeners you can use DisposableEffect
中,因此当视图消失时,您可以删除侦听器。
然后在播放时 - 每隔一段时间重复调用 currentPosition
。由于 Compose 是围绕协程构建的,因此使用 LaunchedEffect
:
很容易做到
var currentValue by remember { mutableStateOf(0L) }
var isPlaying by remember { mutableStateOf(false) }
DisposableEffect(Unit) {
val listener = object : Player.Listener {
override fun onIsPlayingChanged(isPlaying_: Boolean) {
isPlaying = isPlaying_
}
}
mediaPlayer.addListener(listener)
onDispose {
mediaPlayer.removeListener(listener)
}
}
if (isPlaying) {
LaunchedEffect(Unit) {
while(true) {
currentValue = mediaPlayer.currentPosition
delay(1.seconds / 30)
}
}
}
我已经为音频文件播放器创建了自定义 UI,我正在使用 Exoplayer 获取文件并播放它。我没有为 exoplayer 使用自定义控制器,我的 UI 有一个需要根据当前音频位置更新的滑块。我怎样才能做到这一点?请帮忙。
var currentValue by remember { mutableStateOf(0f) }
currentValue = mediaPlayer.getCurrentPosition()
Slider(
modifier = Modifier.weight(1f),
value = currentValue ,
onValueChange = {currentValue = it },
valueRange = 0f.. mediaPlayer.contentDuration()
)
根据您的代码,您希望 mediaPlayer.getCurrentPosition()
以某种方式触发重组。
Compose 只能跟踪 State
对象更改,这是一种为触发重组而创建的特殊类型。
当您需要使用一些非Compose 库时,您需要搜索跟踪更改的方法。在大多数旧图书馆中,都有一些针对这种情况的听众。
在 ExoPlayer
的情况下没有直接的监听器。在此 issue you can see suggestion to use the listener to track isPlaying
state. In Compose to work with listeners you can use DisposableEffect
中,因此当视图消失时,您可以删除侦听器。
然后在播放时 - 每隔一段时间重复调用 currentPosition
。由于 Compose 是围绕协程构建的,因此使用 LaunchedEffect
:
var currentValue by remember { mutableStateOf(0L) }
var isPlaying by remember { mutableStateOf(false) }
DisposableEffect(Unit) {
val listener = object : Player.Listener {
override fun onIsPlayingChanged(isPlaying_: Boolean) {
isPlaying = isPlaying_
}
}
mediaPlayer.addListener(listener)
onDispose {
mediaPlayer.removeListener(listener)
}
}
if (isPlaying) {
LaunchedEffect(Unit) {
while(true) {
currentValue = mediaPlayer.currentPosition
delay(1.seconds / 30)
}
}
}