如何以编程方式在 Exoplayer 的 DefaultTimeBar 中寻找特定的 position/progress

How to programatically seek to a particular position/progress in DefaultTimeBar of Exoplayer

Exo 播放器有一个处理进度的小部件,称为 DefaultTimeBar

<com.google.android.exoplayer2.ui.DefaultTimeBar
android:id="@+id/exo_progress"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

使用此操作方法以编程方式寻找特定位置,例如 android

中的 50%

通过检查源代码,似乎 DefaultTimeBar 不断调用 update() 来检索 bufferedPositionposition 并相应地绘制视图。但它也有几个函数可以自己调用 update() 并重绘所有内容。它首先使用 context 和一些其他参数(如 AttributeSet.

在后台进行初始化

从这里开始,这实际上取决于您愿意用它做什么。如果你只想在 ExoPlayer 中寻找位置(我假设你已经知道),你可以调用这个

    val desiredPosition = simpleExoPlayer.duration / 2.toLong() // 50%
    simpleExoPlayer.seekTo(desiredPosition)

但是,如果您以其他方式使用视图作为 Custom View 并且想自己更新 DefaultTimeBar。您需要了解如何实例化它。我们的 DefaultTimeBar 将不断从实例化它的 class 接收 positionbufferedPosition 值更新; PlayerControlView.

让我们快速分解一下,DefaultTimeBar 是如何实例化和更新的:
1-实例化:

    val timeBar: DefaultTimeBar = DefaultTimeBar(context, null, 0, playbackAttrs)

如您所见,它需要一个 context、一个 @Nullable AttributeSet、一个 defStyleAttr 和一个 @Nullable timeBar AttributeSet。当然,一开始这可能有点令人困惑,但对于初学者来说,请尝试使用上面的示例代码行来实例化它。构造函数中的 playbackAttrs 与从 SimpleExoPlayer 传递到 PlayerControlView 的 playbackAttrs 相同,以便对其进行实例化。如果 playbackAttrs 仍然造成混淆,请检查 SimpleExoPlayer.

的源代码

2- 更新位置: 在实例化 DefaultTimeBar 后,您可以不断地在实例上调用这两个函数

      timeBar.setPosition(position)
      timeBar.setBufferedPosition(bufferedPosition)

3- 修改从 XML: 膨胀的 DefaultTimeBar 视图 我对如何操作 DefaultTimeBar 没有特别的经验,但我假设你可以通过生成的视图作为 DefaultTimeBar 并将其存储在变量中,即:

    val timeBar: DefaultTimeBar = findViewById(R.id.defaulttimebar) as DefaultTimeBar

这可能有效也可能无效。 DefaultTimeBar 扩展了“View”,因此转换可能有效也可能无效。

如果您想定位到特定位置,请始终确保您知道目标位置(例如,用户诱导定位的结果),然后调用 setPosition 来更新 DefaultTimeBar。