如何以编程方式在 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()
来检索 bufferedPosition
和 position
并相应地绘制视图。但它也有几个函数可以自己调用 update()
并重绘所有内容。它首先使用 context
和一些其他参数(如 AttributeSet
.
在后台进行初始化
从这里开始,这实际上取决于您愿意用它做什么。如果你只想在 ExoPlayer 中寻找位置(我假设你已经知道),你可以调用这个
val desiredPosition = simpleExoPlayer.duration / 2.toLong() // 50%
simpleExoPlayer.seekTo(desiredPosition)
但是,如果您以其他方式使用视图作为 Custom View
并且想自己更新 DefaultTimeBar。您需要了解如何实例化它。我们的 DefaultTimeBar
将不断从实例化它的 class 接收 position
和 bufferedPosition
值更新; 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。
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()
来检索 bufferedPosition
和 position
并相应地绘制视图。但它也有几个函数可以自己调用 update()
并重绘所有内容。它首先使用 context
和一些其他参数(如 AttributeSet
.
从这里开始,这实际上取决于您愿意用它做什么。如果你只想在 ExoPlayer 中寻找位置(我假设你已经知道),你可以调用这个
val desiredPosition = simpleExoPlayer.duration / 2.toLong() // 50%
simpleExoPlayer.seekTo(desiredPosition)
但是,如果您以其他方式使用视图作为 Custom View
并且想自己更新 DefaultTimeBar。您需要了解如何实例化它。我们的 DefaultTimeBar
将不断从实例化它的 class 接收 position
和 bufferedPosition
值更新; 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。