云南云桥建设股份有限公司官方网站,近期发生的新闻,拟在建项目信息网官网,网站建设的意义与目的View版及更多功能使用#xff1a;详见
一、概念
1.1 实现方式选择
media3-ui-composemedia3-ui-compose-material3界面组件基础组件。开箱即用#xff0c;含预设样式的按钮或控件。状态管理提供 remember***State 状态持有者来管理逻辑。在内部管理状态#xff0c;但仍可…View版及更多功能使用详见一、概念1.1 实现方式选择media3-ui-composemedia3-ui-compose-material3界面组件基础组件。开箱即用含预设样式的按钮或控件。状态管理提供 remember***State 状态持有者来管理逻辑。在内部管理状态但仍可根据需要访问状态容器。使用场景使用自定义风格构建播放器界面。使用 Material3 预设快速构建。1.2 显示组件ContentFrameComposablefun ContentFrame(player: Player?,modifier: Modifier Modifier,surfaceType: SurfaceType Int SURFACE_TYPE_SURFACE_VIEW,contentScale: ContentScale ContentScale.Fit,keepContentOnReset: Boolean false,shutter: Composable () - Unit { Box(Modifier.fillMaxSize().background(Color.Black)) },)参数 contentScale视频缩放。参数 keepContentOnReset为 true 播放器重置时将保持最后一帧画面显示为 false 则会清空渲染表面。参数 shutter用于在需要覆盖视频渲染表面时显示。默认情况下它显示为黑色背景。1.3 控制组件组件中可以直接拿到对应状态里的属性/方法推荐通过this调用方便阅读。通用组件PlayPauseButton播放和暂停。SeekBackButton根据预设值向前调整播放进度。SeekForwardButton根据预设值向后调整播放进度。NextButton跳转到下一个媒体项。PreviousButton跳转到上一个媒体项。RepeatButton切换重复模式。ShuffleButton切换随机模式。MuteButton切换静音模式。TimeText显示时长相关文本。Material3PositionAndDurationText当前位置和总时长的文本。PositionText当前位置的文本。DurationText总时长的文本。RemainingDurationText剩余时长的文本。自定义方式PlayPauseButton(player) { Icon( modifier Modifier .size(20.dp) .clickable( enabled this.isEnabled, onClick { this.onClick() } ), imageVector if (this.showPlay) Icons.Default.PlayArrow else Icons.Default.PauseCircle, contentDescription if (this.showPlay) Play else Pause ) }Material3 方式Row { SeekBackButton(player) PlayPauseButton(player) SeekForwardButton(player) }1.4 状态自定义控制组件如果上面没有需要的组件可以自行通过状态来构建自定义组件。状态获取方式播放暂停rememberPlayPauseButtonState上一项rememberPreviousButtonState下一项rememberNextButtonState重复模式rememberRepeatButtonState随机模式rememberShuffleButtonState播放速度rememberPlaybackSpeedStateval state rememberPlayPauseButtonState(player) Icon( modifier Modifier .size(20.dp) .clickable( enabled state.isEnabled, onClick { state.onClick() } ), imageVector if (state.showPlay) Icons.Default.PlayArrow else Icons.Default.PauseCircle, contentDescription if (state.showPlay) Play else Pause )二、添加依赖最新版本[versions] media3 1.9.0 [libraries] media3-exoplayer { module androidx.media3:media3-exoplayer, version.ref media3 } media3-datasource-okhttp { module androidx.media3:media3-datasource-okhttp, version.ref media3 } #二选一 media3-ui-compose { module androidx.media3:media3-ui-compose, version.ref media3 } media3-ui-compose-material3 { moudle androidx.media3:media3-ui-compose-material3, version.ref media3 }三、实现方式3.1 ViewModel在 ViewModel 中提供 ExoPlayer将业务和UI分离。class PlayerVM : ViewModel() { private val playlist mutableListOfMediaItem() private val playerListener by lazy { object : Player.Listener { } } val player by lazy { ExoPlayer.Builder(APP.context) .setSeekBackIncrementMs(10000) .setSeekForwardIncrementMs(10000) .build() .apply { addListener(playerListener) setMediaItem(MediaItem.fromUri(https://www.w3schools.com/html/movie.mp4)) prepare() playWhenReady true } } override fun onCleared() { super.onCleared() player.release() } }3.2 UIComposable private fun Demo( viewModel: PlayerVM viewModel() ) { ContentFrame(viewModel.player) }