如何让seekbar的拇指跟随Videoview的当前时间?

Posted

技术标签:

【中文标题】如何让seekbar的拇指跟随Videoview的当前时间?【英文标题】:How to make the thumb of seekbar follows the current time of Videoview? 【发布时间】:2021-01-27 07:18:09 【问题描述】:

我以某种方式使我的视频视图跟随搜索栏拇指,但我找不到反之亦然的方法:让拇指跟随视频视图的当前时间。

这是我的代码。

class play_video : AppCompatActivity() 
    var seekbar:SeekBar? = null
    var vidView:VideoView? = null
    var current_time:TextView? = null
    override fun onCreate(savedInstanceState: Bundle?) 
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_play_video)

        seekbar = findViewById<SeekBar>(R.id.seekbar_movie)
        vidView = findViewById<VideoView>(R.id.videoView)
        current_time = findViewById<TextView>(R.id.currenttime)


        val viduri = Uri.parse("android.resource://" + packageName + "/" + R.raw.test1)
        val updateHandler = Handler()
        vidView?.setVideoURI(viduri)
        val metadata = MediaMetadataRetriever()
        metadata.setDataSource(this,viduri)
        val vidLength = metadata.extractMetadata(MediaMetadataRetriever.METADATA_KEY_DURATION)
        seekbar?.max = vidLength!!.toInt()
        set_time(vidLength!!.toInt())

        vidView?.setOnClickListener 
            if(vidView!!.isPlaying)
                vidView?.pause()
            else
                vidView?.start()
        
        seekbar?.setProgress(vidView!!.currentPosition)

        vidView?.start()

        seekbar?.setOnSeekBarChangeListener(object: SeekBar.OnSeekBarChangeListener
        
            override fun onProgressChanged(p0: SeekBar, p1: Int, p2: Boolean)
            
                seekbar?.progress?.let  vidView?.seekTo(it) 
                val p1_sec = (p1/1000).toInt()
                val p1_minute = (p1_sec/60).toInt()
                val p1_second = p1_sec%60
                current_time?.text = p1_minute.toString() + ":" + p1_second.toString()
            
            override fun onStartTrackingTouch(p0: SeekBar)
            
                seekbar?.progress?.let  vidView?.seekTo(it) 
            
            override fun onStopTrackingTouch(p0: SeekBar)
            
                if(vidView!!.isPlaying)
                    vidView?.start()
            
        )
    

我搜索了很多文章,但无法理解如何单独使用 videoview。我应该使用 MediaPlayer 重新编码还是有更好的方法?

【问题讨论】:

【参考方案1】:

您只需创建一个处理程序,它会重复并设置搜索栏。将此代码放入 onCreate 函数中。

val handler = Handler(Looper.getMainLooper())
runOnUiThread(object : Runnable 
    override fun run() 
        seekbar?.setProgress(vidView!!.currentPosition)
        handler.postDelayed(this, 1000) //Set the update time
    

1000 毫秒只是一个示例,如果您想更快地更新搜索栏,您应该使用更小的延迟。

我自己做的,这是现场搜索栏和性能之间的最佳折衷。您还可以编辑延迟以加快更新速度。

但请记住在onProgressChanged 中添加检查,例如if(p2) ,这样只有用户更改进度而不是系统本身时,进度才会更改。 像这样:

override fun onProgressChanged(p0:SeekBar, p1:Int, p2:Boolean)
            
                if(p2) 
                    seekbar?.progress?.let  vidView?.seekTo(it) 
                    val p1_sec = (p1/1000).toInt()
                    val p1_minute = (p1_sec/60).toInt()
                    val p1_second = p1_sec%60
                    current_time?.text = p1_minute.toString()+":"+p1_second.toString()
               
            

【讨论】:

你的意思是这个处理程序代码应该在 vidView 的 OnProgressChangedListner 中? 不,您应该签入onProgressChanged 函数if(p2)。这将检查搜索栏的更改是否是“手动”而不是以编程方式进行的。 我按照你说的做了,发生了两件事:1. 搜索栏没有先改变。 2.如果我移动拇指,它只会从拇指位置开始播放1秒的视频 我已经编辑了我的答案。我希望你现在更清楚了。 很抱歉,我想我没有得到您的评论。你能告诉我处理函数到底去哪里了吗?我认为搜索栏还没有正常工作。

以上是关于如何让seekbar的拇指跟随Videoview的当前时间?的主要内容,如果未能解决你的问题,请参考以下文章

Seekbar拇指,左右两侧的填充/边距透明

Seekbar进度drawable异常行为onPause

当在视频视图android中使用seekbar时如何举杯?

textview跟随seekbar的拖动改变位置

MediaController 的默认 SeekBar 不同步

使用不跟随拇指的屏幕边缘平移手势识别器的弹出视图控制器