之前简单练习过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) } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)