You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ExoPlayer的StyledPlayerView中实现TimeBar拖动同步视频进度

实现StyledPlayerView拖动TimeBar实时跳转视频进度

要实现拖动TimeBar时视频进度实时同步,核心是获取StyledPlayerView内置的TimeBar并添加OnScrubListener监听,在拖动过程中调用播放器的seekTo方法。以下是具体实现方案:

关键步骤

  1. 获取内置TimeBar:StyledPlayerView的控制器(PlayerControlView)中默认包含id为exo_progress的TimeBar组件,通过控制器的findViewById即可获取。
  2. 添加拖动监听:为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 23:27:27