Android 使用Kotlin开发 ExoPlayer 自定义SeekBar设置总进度播放进度与缓存进度
要在Android中使用Kotlin开发ExoPlayer并自定义SeekBar来设置总进度、播放进度和缓存进度,你可以按照以下步骤进行操作:
- 在build.gradle文件中添加ExoPlayer依赖项:
implementation 'com.google.android.exoplayer:exoplayer-core:2.X.X'
implementation 'com.google.android.exoplayer:exoplayer-ui:2.X.X'
请将 2.X.X 替换为你想要使用的最新版本号。
- 在你的布局文件中添加一个SeekBar和两个TextView用于显示播放进度和缓存进度:
<SeekBar
android:id="@+id/seekBar"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/playbackPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0:00" />
<TextView
android:id="@+id/bufferedPosition"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="0:00" />
- 在你的Activity或Fragment中,找到SeekBar、TextView和ExoPlayer实例:
val seekBar = findViewById<SeekBar>(R.id.seekBar)
val playbackPositionTextView = findViewById<TextView>(R.id.playbackPosition)
val bufferedPositionTextView = findViewById<TextView>(R.id.bufferedPosition)
val exoPlayer = ExoPlayerFactory.newSimpleInstance(this)
- 设置SeekBar的最大值为视频的总时长,并添加一个OnSeekBarChangeListener以便更新播放进度:
seekBar.max = exoPlayer.duration.toInt()
seekBar.setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener {
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if (fromUser) {
exoPlayer.seekTo(progress.toLong())
}
}
override fun onStartTrackingTouch(seekBar: SeekBar?) {}
override fun onStopTrackingTouch(seekBar: SeekBar?) {}
})
- 创建一个Runnable并使用Handler定期更新SeekBar的进度和TextView的文本:
val handler = Handler()
val runnable = object : Runnable {
override fun run() {
val playbackPosition = exoPlayer.currentPosition
val bufferedPosition = exoPlayer.bufferedPosition
seekBar.progress = playbackPosition.toInt()
playbackPositionTextView.text = formatTime(playbackPosition)
bufferedPositionTextView.text = formatTime(bufferedPosition)
handler.postDelayed(this, 1000) // 每秒更新一次
}
}
handler.postDelayed(runnable, 0) // 立即开始第一次更新
- 在Activity的onStart()方法中开始播放视频,并在onStop()方法中停止播放和更新进度:
override fun onStart() {
super.onStart()
exoPlayer.playWhenReady = true
handler.postDelayed(runnable, 0)
}
override fun onStop() {
super.onStop()
exoPlayer.playWhenReady = false
handler.removeCallbacks(runnable)
}
- 创建一个辅助函数来格式化时间:
private fun formatTime(timeMs: Long): String {
val seconds = (timeMs / 1000).toInt() % 60
val minutes = (timeMs / (1000 * 60) % 60)
val hours = (timeMs / (1000 * 60 * 60) % 24)
return String.format("%02d:%02d:%02d", hours, minutes, seconds)
}
现在,你就可以使用Kotlin开发ExoPlayer并自定义SeekBar来设置总进度、播放进度和缓存进度了。记得在布局文件中添加相应的视图,并在代码中找到它们的引用
原文地址: https://www.cveoy.top/t/topic/iIPF 著作权归作者所有。请勿转载和采集!