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

如何在ExoPlayer 2中控制栏重显后仍禁用进度条拖拽

如何在ExoPlayer2中持久禁用进度条拖拽(保持滑块可见)

你的问题核心是ExoPlayer控制栏重新显示时,DefaultTimeBar的启用状态会被控制器逻辑重置,导致之前设置的isEnabled=false失效。这里提供两种可靠的解决方法:

方法一:监听控制栏显示事件,每次显示时重新禁用

利用PlayerView的控制器可见性监听器,在控制栏每次显示时,重新禁用进度条的拖拽功能:

// 初始设置禁用
binding.exoProgress.isEnabled = false

// 添加控制栏可见性监听
playerView.addControllerVisibilityListener { visibility ->
    if (visibility == View.VISIBLE) {
        // 控制栏显示时,再次禁用进度条
        binding.exoProgress.isEnabled = false
    }
}

这个方法直接针对问题场景,每次控制栏重新加载时覆盖ExoPlayer的默认状态设置。

方法二:自定义不可拖拽的TimeBar(更彻底)

通过继承DefaultTimeBar,重写触摸事件来拦截所有拖拽相关操作,从根源上禁止进度条响应拖拽:

  1. 创建自定义TimeBar类:
class NonDraggableTimeBar(context: Context, attrs: AttributeSet?) : DefaultTimeBar(context, attrs) {
    override fun onTouchEvent(event: MotionEvent): Boolean {
        // 拦截所有触摸事件,阻止父类处理拖拽逻辑
        return true
    }
}
  1. 在你的控制栏布局文件中替换原有的DefaultTimeBar:
<com.your.app.package.NonDraggableTimeBar
    android:id="@+id/exo_progress"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>

这种方法不需要依赖控制栏的状态监听,无论控制栏如何刷新,进度条都不会响应拖拽操作,同时完全保留进度条和滑块的可见性。

为什么原方法失效?

ExoPlayer的PlayerControlView在每次显示时,会根据播放器的播放状态(如是否可seek)重新初始化控件的isEnabled状态,所以你单次设置的isEnabled=false会被覆盖。

内容的提问来源于stack exchange,提问作者SmallGrammer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:10:25