我正在使用 ExoPlayer 构建音乐应用。
seekBar 出现问题,播放歌曲时它不动..
我可以搜索歌曲的特定部分,但搜索栏上不显示进度。
songDetails.xml
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="0dp"
android:layout_height="18dp"
android:layout_marginStart="10dp"
android:layout_marginTop="40dp"
android:layout_marginEnd="10dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.35"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/ic_like"
app:layout_constraintVertical_bias="0.0" />
<TextView
android:id="@+id/txt_current_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="10dp"
android:layout_marginTop="5dp"
android:includeFontPadding="false"
android:text="00:00"
android:textColor="@color/app_name_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="@+id/seek_bar"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="@+id/seek_bar"
app:layout_constraintTop_toBottomOf="@+id/seek_bar"
app:layout_constraintVertical_bias="0.0" />
<TextView
android:id="@+id/txt_song_duration"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginEnd="10dp"
android:includeFontPadding="false"
android:text="00:00"
android:textColor="@color/app_name_color"
app:layout_constraintBottom_toBottomOf="@+id/txt_current_time"
app:layout_constraintEnd_toEndOf="@+id/seek_bar"
app:layout_constraintHorizontal_bias="0.996"
app:layout_constraintStart_toEndOf="@+id/txt_current_time"
app:layout_constraintTop_toTopOf="@+id/txt_current_time"
app:layout_constraintVertical_bias="1.0" />
SongDetailsViewModel
class SongViewModel @ViewModelInject constructor(musicServiceConnection: MusicServiceConnection) : ViewModel() {
private val playBackState = musicServiceConnection.playbackState
private val _currentSongDuration = MutableLiveData<Long>()
val currentSongDuration: LiveData<Long> = _currentSongDuration
private val _currentPlayerPosition = MutableLiveData<Long>()
val currentPlayerPosition: LiveData<Long> =
_currentPlayerPosition
init {
updateCurrentPlayerPosition()
}
private fun updateCurrentPlayerPosition() {
viewModelScope.launch {
while (true){
val position = playBackState.value?.currentPlaybackPosition
if (currentPlayerPosition.value != position){
_currentPlayerPosition.postValue(position!!)
_currentSongDuration.postValue(MusicService.curSongDuration)
}
delay(UPDATE_PLAYER_POSITION_INTERVAL)
}
}
}
}
歌曲片段
@AndroidEntryPoint
class SongDetailsFragment : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
subscribeToObservers()
binding.seekBar.setOnSeekBarChangeListener(object : OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
updatePlayingTime(progress.toLong())
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {
shouldUpdateSeekBar = false
}
override fun onStopTrackingTouch(seekBar: SeekBar?) {
binding.seekBar.let {
mainViewModel.seekTo(it.progress.toLong())
shouldUpdateSeekBar = true
}
}
})
}
private fun subscribeToObservers() {
mainViewModel.currentlyPlayingSong.observe(viewLifecycleOwner) {
if (it == null) return@observe
currentPlayingSong = it.toSong()
val formattedDuration = it.toSong()?.duration?.let { Utility.getSongDuration(true, it) }
binding.txtSongDuration.text = formattedDuration
}
}
mainViewModel.playBackState.observe(viewLifecycleOwner) {
playbackState = it
binding.seekBar.progress = it?.position?.toInt() ?: 0}
songViewModel.currentPlayerPosition.observe(viewLifecycleOwner){
binding.seekBar.progress = it.toInt()
if (shouldUpdateSeekBar){
binding.seekBar.progress = it.toInt()
updatePlayingTime(it)
}
}
songViewModel.currentSongDuration.observe(viewLifecycleOwner) {
binding.seekBar.max = it.toInt()
}
}
private fun updatePlayingTime(ms: Long){
val dateFormat = SimpleDateFormat("mm:ss", Locale.getDefault())
binding.txtCurrentTime.text = dateFormat.format(ms)
}
我已经被困在这个问题上好几天了.. 不知道问题出在哪里。除非您寻找,否则片段中未观察/更新当前歌曲位置。
seekbar 不动了!帮助!
答案 0 :(得分:0)
您可以使用 exoplayer 的默认时间栏来防止额外编码
<com.google.android.exoplayer2.ui.DefaultTimeBar
android:id="@id/exo_progress"
android:layout_width="@dimen/infobar_width_1920dp"
android:layout_height="wrap_content"
android:layout_weight="1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/tv_content_name"
app:played_color="@color/themeRed"
app:buffered_color="@color/colorWhiteTrans_25"
app:scrubber_color="@color/white"
app:unplayed_color="@color/black"
app:scrubber_enabled_size="@dimen/item_margin_20dp"
app:scrubber_dragged_size="@dimen/item_margin_30dp" />