之前简单练习过Exoplayer,当前只是简单写一下,后面就再也没涉及此处。不过最近写起来了从而记录下。
1.Kotlin–VideoViewvideoView结合自定义进度条,切换后台停止,再次打开时自动播放
-->
private lateinit var mVideoView: VideoView
private lateinit var mCurrentTv: TextView
private lateinit var mEndTv: TextView
private lateinit var mSeekbar: SeekBar
private lateinit var mCancel: ImageView
private lateinit var mPauseImg: ImageView
private lateinit var mStartImg: ImageView
private lateinit var mStartPro: ProgressBar
private lateinit var mSeekbarLinar: LinearLayout
private var isPlay = true
private var startInt = 0
private var total = 0
val handler: Handler = @SuppressLint("HandlerLeak")
object : Handler() {
}
var runnable: Runnable = object : Runnable {
override fun run() {
progress() //执行更新
if (!isPlay) {
handler.postDelayed(this, 500)
}
}
}
override fun onViewCreated(rootView: View, savedInstanceState: Bundle?) {
super.onViewCreated(rootView, savedInstanceState)
mVideoView = rootView.findViewById(R.id.video)
mCurrentTv = rootView.findViewById(R.id.currentTv)
mEndTv = rootView.findViewById(R.id.endTv)
mSeekbar = rootView.findViewById(R.id.seekbar)
mCancel = rootView.findViewById(R.id.cancel)
mStartImg = rootView.findViewById(R.id.startImg)
mPauseImg = rootView.findViewById(R.id.pauseImg)
mSeekbarLinar = rootView.findViewById(R.id.seekbarLina)
mStartPro = rootView.findViewById(R.id.startPro)//等待加载
playStart()
val uri = Uri.parse(“视频地址”)
mVideoView.setVideoURI(uri)
//开始播放
mStartImg.setonClickListener {
if (isPlay) playStart()
}
//点击视频暂停
mVideoView.setonTouchListener { _, _ ->
if (mVideoView.isPlaying) {
mPauseImg.visibility = View.VISIBLE
mStartPro.visibility = View.GONE//等待加载圈
mVideoView.pause()
isPlay = true
}
false
}
//点击暂停按钮
mPauseImg.setonClickListener {
if (isPlay) playStart()
}
mVideoView.setonPreparedListener { mediaPlayer ->
mediaPlayer.setonInfoListener(MediaPlayer.onInfoListener { _, what, _ ->
if (what == MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START) {
mStartPro.visibility = View.GONE//等待加载圈
}
return@onInfoListener false
})
}
//监听seekBar
mSeekbar.setonSeekBarChangeListener(object : SeekBar.onSeekBarChangeListener {
//进度已更改
override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
if (fromUser) {
progress()
mVideoView.seekTo(progress)
}
}
override fun onStartTrackingTouch(seekBar: SeekBar) {}
override fun onStopTrackingTouch(seekBar: SeekBar) {}
})
//在视频没有初始化之前禁止拖动
mSeekbar.setonTouchListener { _, _ ->
total == 0
}
//监听videoView是否播放完成
mVideoView.setonCompletionListener { dismiss() }
}
private fun playStart() {
showsDialog
mStartImg.visibility = View.GONE
mPauseImg.visibility = View.GONE
mSeekbarLinar.visibility = View.VISIBLE
mStartPro.visibility = View.VISIBLE//等待加载圈
mVideoView.start()
isPlay = false
handler.postDelayed(runnable, 500)
}
//更新视频播放进度
private fun progress() {
startInt = mVideoView.currentPosition //现在的播放位置
if (total <= 0) {
total = mVideoView.duration //总的播放长度
mSeekbar.max = total
}
mCurrentTv.text = transformationDate(startInt)
mEndTv.text = transformationDate(total)
mSeekbar.progress = startInt
}
//转换字符
private fun changeString(num: Int): String {
return if (num in 0..9) "0$num" else "" + num
}
//转换时分秒
private fun transformationDate(times: Int): String {
var second = times / 1000
val time = second / 3600
val branch = second / 60
second %= 60
return changeString(time) + ":" + changeString(branch) + ":" + changeString(second)
}
override fun onPause() {
super.onPause()
if (startInt != 0) {
mVideoView.pause()
isPlay = true
startInt = mVideoView.currentPosition
handler.removeCallbacks(runnable)
}
}
override fun onStart() {
super.onStart()
if (startInt != 0) {
isPlay = false
mVideoView.start()
mVideoView.seekTo(startInt)
mStartImg.visibility = View.GONE
mPauseImg.visibility = View.GONE
handler.postDelayed(runnable, 500)
}
}
override fun onDestroyView() {
super.onDestroyView()
handler.removeCallbacks(runnable)
}
}



