专业编程基础技术教程

网站首页 > 基础教程 正文

Kotlin编写DialogFragment音视频解析二

ccvgpt 2024-07-24 11:08:29 基础教程 10 ℃

这篇文章是继续上一篇讲解得,上一篇我们说了一下关于Kotlin解析音视频得内容,上篇主要说了关于整个项目得回调方法,这篇我主要说一下关于项目里面重要的几个对话框。

第一个对话框,首先我把全部代码贴出来,然后一一分析。

Kotlin编写DialogFragment音视频解析二

class AudioDialog : DialogFragment() {

    var startTime: Long = 0
    var finalTime: Long = 0
    lateinit var mediaPlayer: MediaPlayer
    lateinit var countDownTimer: CountDownTimer

    companion object {
        val TAG = AudioDialog::javaClass.name

        lateinit var file: File

        fun show(fragmentManager: FragmentManager, file: File) {
            this.file = file
            AudioDialog().show(fragmentManager, TAG)
        }
    }

    @SuppressLint("SetTextI18n", "ClickableViewAccessibility")
    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {

        val view = activity!!.layoutInflater.inflate(R.layout.dialog_audio_preview, null)
        val seekBar = view.findViewById<SeekBar>(R.id.seekBar)
        seekBar.isEnabled = false
        val info = view.findViewById<AppCompatTextView>(R.id.video_info)

        if (file != null) {
            mediaPlayer = MediaPlayer.create(activity, Uri.fromFile(file))
            mediaPlayer.start()
        }

        finalTime = mediaPlayer.duration.toLong()
        startTime = mediaPlayer.currentPosition.toLong()
        seekBar.max = finalTime.toInt()

        mediaPlayer.setOnCompletionListener {
            dismiss()
        }

        seekBar.setMax(mediaPlayer.duration)

        seekBar.setOnTouchListener(object : OnTouchListener {
            override fun onTouch(v: View, event: MotionEvent): Boolean {
                return true
            }
        })

        countDownTimer = object : CountDownTimer(mediaPlayer.duration.toLong(), 250) {
            override fun onTick(millisUntilFinished: Long) {

                startTime = mediaPlayer.currentPosition.toLong()
                info.text = "Duration: ${Utils.milliSecondsToTimer(mediaPlayer.duration.toLong())}\n" + getTime()
                seekBar.progress = seekBar.progress + 250

            }

            override fun onFinish() {
            }
        }.start()

        return AlertDialog.Builder(activity)
                .setView(view)
                .setTitle("Preview")
                .setPositiveButton("Cancel") { dialog, which ->
                    dismiss()
                }
                .create()
    }

    fun getTime(): String {
        return String.format("%d min, %d sec",
                TimeUnit.MILLISECONDS.toMinutes(startTime),
                TimeUnit.MILLISECONDS.toSeconds(startTime) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(startTime)))

    }

    override fun onPause() {
        super.onPause()
        mediaPlayer.stop()
        mediaPlayer.reset()
        mediaPlayer.release()
        countDownTimer.cancel()
    }
}

整个对话使用到了一个MediaPlayer方法,主要是用来做音视频相关的业务,这也是Android 官网提供的API。


CountDownTimer 这个方法也是安卓OS包下面的一个方法,作用就是用倒计时用的。这里主要是用来解析一个视频的一个开始时间。


项目里面设计到一个布局界面这里我拿出来。


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="10dp"
    android:paddingTop="10dp">

    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:clickable="false"
        android:enabled="false"
        android:focusable="false" />

    <android.support.v7.widget.AppCompatTextView
        android:id="@+id/video_info"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp"
        android:textColor="#000000"
        android:textSize="16sp" />

</LinearLayout>

OK 大家看到这个布局应该知道具体做了什么了,就是一个弹窗来解析一下视频,然后裁剪开始时间和结束时间。

Tags:

最近发表
标签列表