如何在ExoPlayer的StyledPlayerView中实现TimeBar拖动同步视频进度
实现StyledPlayerView拖动TimeBar实时跳转视频进度
要实现拖动TimeBar时视频进度实时同步,核心是获取StyledPlayerView内置的TimeBar并添加OnScrubListener监听,在拖动过程中调用播放器的seekTo方法。以下是具体实现方案:
关键步骤
- 获取内置TimeBar:StyledPlayerView的控制器(PlayerControlView)中默认包含id为
exo_progress的TimeBar组件,通过控制器的findViewById即可获取。 - 添加拖动监听:为TimeBar设置
OnScrubListener,在拖动开始、进度变化、拖动结束三个阶段分别处理逻辑:- 拖动开始:暂停视频,避免播放与拖动冲突
- 进度变化:实时调用
player.seekTo()跳转到当前拖动位置 - 拖动结束:恢复播放(根据需求调整)
修改后的代码实现
更新setListeners方法
在你的setListeners方法中添加以下代码:
private void setListeners() { // 原有关闭按钮和长按监听代码保持不变 imageViewClose.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { player.release(); if (goBackLockScreen) { navController.navigate(R.id.action_showTutorialFragment_to_lockScreenFragment); } else navController.navigate(R.id.action_showTutorialFragment_to_mainMenu); } }); videoViewTutorial.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { player.pause(); videoViewTutorial.hideController(); return false; } }); // 新增TimeBar拖动监听逻辑 PlayerControlView controlView = videoViewTutorial.getController(); TimeBar timeBar = controlView.findViewById(R.id.exo_progress); if (timeBar != null) { timeBar.addListener(new TimeBar.OnScrubListener() { @Override public void onScrubStart(TimeBar timeBar, long position) { // 拖动开始时暂停视频 if (player.isPlaying()) { player.pause(); } } @Override public void onScrubbingProgressChanged(TimeBar timeBar, long position) { // 实时同步进度到播放器 player.seekTo(position); } @Override public void onScrubEnd(TimeBar timeBar, long position, boolean canceled) { // 拖动结束后恢复播放 player.seekTo(position); player.play(); } }); } }
补充生命周期处理(可选)
为避免内存泄漏,建议在Fragment的onDestroyView方法中释放播放器资源:
@Override public void onDestroyView() { super.onDestroyView(); if (player != null) { player.release(); player = null; } }
注意事项
- 确保导入对应的类:
import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.ui.TimeBar; - 如果自定义了控制器布局,需确认TimeBar的id与代码中一致(默认是
exo_progress)。 - 拖动过程中频繁调用
seekTo可能会增加设备负载,若视频文件较大可根据需求调整频率(比如每隔一定毫秒再执行seek),但通常对于本地视频或低码率视频不会有明显问题。
内容的提问来源于stack exchange,提问作者Ulvi Ismayilov
相关产品推荐
相关产品推荐

