记录探索安卓简单视频播放

记录探索安卓简单视频播放,第1张

记录探索安卓简单视频播放

之前简单练习过Exoplayer,当前只是简单写一下,后面就再也没涉及此处。不过最近写起来了从而记录下。

1.Kotlin–VideoView

videoView结合自定义进度条,切换后台停止,再次打开时自动播放

    
    
        

        

        

        

            

            

            
        -->

    
     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)
    }
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4014470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-22
下一篇 2022-10-22

发表评论

登录后才能评论

评论列表(0条)

保存