课程学院-视频播放
最近抽空把沙滩app的课程学院部分给做了一下,效果么,照着网站上的来(其实是不会设计) 照着文档,建好bean类和获取方法,完成了数据的获取。 看了下播放器,是阿里云的,又照着那边的文档,导入sdk,初始化播放器设置,把之前获取的播放地址,凭证导入,?,可以播放了
折腾播放控件
好了,既然可以播放了,那就开始写播放器的控制按键,布局简单的借鉴了下bilibili 有播放/暂停/重播,进度条,时间,全屏,返回(全屏时返回初始的样子) 因为之前学习过视频播放的小demo,所以就打算仍然把播放、控制都放进了viewModel,添加进lifecycle进行观察 本来打算写个MyMediaPlayer继承AliPlayer,LifecycleObserver,发现AliPlayer是个接口(想想就算了,haha),就直接把写的PlayerViewModel直接继承一下,丢进lifecycle了
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun pausePlayer() {
aliPlayer.pause()
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun resumePlayer() {
aliPlayer.start()
}
lifecycle.addObserver(playerViewModel)
然后处理一下播放控件的功能 1. 整个控件页面的显示与隐藏
/**
* 控制播放控件的显示于隐藏
*/
fun toggleControllerVisibility() {
if (_controllerFrameVisibility.value == View.INVISIBLE) {
_controllerFrameVisibility.value = View.VISIBLE
controllerShowTime = System.currentTimeMillis()
viewModelScope.launch {
delay(3000)
if (System.currentTimeMillis() - controllerShowTime >= 3000) {
_controllerFrameVisibility.value = View.INVISIBLE
} else {
Log.d("myLog", "delay时间未超过3秒")//测试时使用
}
}
} else {
_controllerFrameVisibility.value = View.INVISIBLE
}
}
- 播放按钮的图标显示和功能(后续把点击屏幕的播放暂停补上)
/**
* 控制播放按钮的图标显示
*/
fun togglePlayerStatus() {
when (_playerStatus.value) {
PlayerStatus.Playing -> {
aliPlayer.pause()
_playerStatus.value = PlayerStatus.Paused
}
PlayerStatus.Paused -> {
aliPlayer.start()
_playerStatus.value = PlayerStatus.Playing
}
PlayerStatus.Completed -> {
aliPlayer.start()
_playerStatus.value = PlayerStatus.Playing
}
else -> {
return
}
}
}
- 进度条和时间的实时更新
private fun updatePlayerProgress() {
lifecycleScope.launch {
while (true) {
delay(1000)
val currentPosition = playerViewModel.currentPositionValue.value
binding.controllerFrame.seekBar.progress = currentPosition?.toInt() ?: 0
}
}
}
- 返回键的功能区分 一开始没注意,全屏直接返回了上一个界面,然后也没做强制竖屏啥的hahaha
binding.controllerFrame.videoBack.setOnClickListener {
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
} else {
//返回,若视频在播放中,则暂停播放
playerViewModel.aliPlayer.stop()
finish()
}
}
- 全屏按钮(遇到些问题/(ㄒoㄒ)/~~)
binding.controllerFrame.fullScreen.setOnClickListener {
//点击后全屏(暂时可用)
//Log.d("myLog", "点击了全屏")
//设置屏幕的orientation
requestedOrientation =
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) {
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
} else {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}
}
override fun onWindowFocusChanged(hasFocus: Boolean) {
super.onWindowFocusChanged(hasFocus)
if (resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
hideSystemUI()
playerViewModel.emmitVideoResolution()
}
}
很遗憾,这边出了问题,我发现不知道为啥,全屏之后整改生命周期重新开始了,之前做的demo就没有这样(也可能是我没发现。。),然后全屏是做到了,但是视频直接重新加载了,不得已在viewModel中加了个hasGetVideo去保证视频不重新加载。。 另外我试过在manifest中加上android:configChanges="orientation|screenSize|keyboardHidden",但是发现hideSystemUI()失效了。。导航栏状态栏没隐藏,emmmmm。。。。后面有时间了在研究研究
总结
总的来说,基本的视频播放还是挺好弄的,难弄的是一些播放控件以及复杂一些的功能,目前够用就行,想要弄些复杂的功能,之后再弄。 不知道小伙伴们都是怎么处理播放部分的,是用别人的轮子,还是向我一样,自己简单写个hahaha。