如何在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,重写触摸事件来拦截所有拖拽相关操作,从根源上禁止进度条响应拖拽:
- 创建自定义TimeBar类:
class NonDraggableTimeBar(context: Context, attrs: AttributeSet?) : DefaultTimeBar(context, attrs) { override fun onTouchEvent(event: MotionEvent): Boolean { // 拦截所有触摸事件,阻止父类处理拖拽逻辑 return true } }
- 在你的控制栏布局文件中替换原有的
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
相关产品推荐
相关产品推荐

