对 Jetpack 的简单改编由这个答案组成
@Composable
fun VideoPlayer(myVideo: MyVideo, modifier: Modifier = Modifier) {
val context = LocalContext.current
val exoPlayer = remember {
ExoPlayer.Builder(context).build().apply {
setMediaItem(myVideo.asMediaItem())
repeatMode = ExoPlayer.REPEAT_MODE_ALL
playWhenReady = true
prepare()
play()
}
}
DisposableEffect(
AndroidView(
modifier = modifier,
factory = {
PlayerView(context).apply {
player = exoPlayer
useController = false
FrameLayout.LayoutParams(
ViewGroup.LayoutParams
.MATCH_PARENT,
ViewGroup.LayoutParams
.MATCH_PARENT
)
}
}
)
) {
onDispose {
exoPlayer.release()
}
}
}
这将是asMediaItem()
扩展功能
private fun MyVideo.asMediaItem() =
MediaItem.Builder()
.setUri(url)
.setMediaId("some-media-id")
.setTag("some-video-tag")
.setMediaMetadata(
MediaMetadata.Builder().setDisplayTitle("Video").build()
)
.build()
和 MyVideo 类,它模拟了一个非常基本的视频
data class MyVideo(val url: String, val previewImage: String)
此处删除控件的关键是useController = false