如何让seekbar的thumb跟随Videoview的当前时间?
How to make the thumb of seekbar follows the current time of Videoview?
我不知何故让我的 videoview 跟随搜索栏拇指,但我找不到反之亦然的方法:让拇指跟随当前视频观看时间。
这是我的代码。
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 重新编码还是有更好的方法?
您只需创建一个处理程序,重复并设置搜索栏。将此代码放入 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 毫秒只是一个例子,如果你想让你的搜索栏更新得更快,你应该使用更小的延迟。
我自己做的,这是实时搜索栏和性能之间的最佳折衷方案。您还可以编辑延迟以获得更快的更新。
但请记住像 if(p2) { }
一样在 onProgressChanged
中添加一个检查,这样进度只会在用户更改进度而不是系统本身时更改。
像那样:
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()
}
}
我不知何故让我的 videoview 跟随搜索栏拇指,但我找不到反之亦然的方法:让拇指跟随当前视频观看时间。
这是我的代码。
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 重新编码还是有更好的方法?
您只需创建一个处理程序,重复并设置搜索栏。将此代码放入 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 毫秒只是一个例子,如果你想让你的搜索栏更新得更快,你应该使用更小的延迟。
我自己做的,这是实时搜索栏和性能之间的最佳折衷方案。您还可以编辑延迟以获得更快的更新。
但请记住像 if(p2) { }
一样在 onProgressChanged
中添加一个检查,这样进度只会在用户更改进度而不是系统本身时更改。
像那样:
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()
}
}