Я настраиваю Activity для приложения Android, состоящего из VideoView и Slider.Я пытаюсь прокрутить текст ниже в соответствии с ходом видео.
Мое решение работает благодаря потоку, который изменяет выбранный слайд в соответствии с ходом видео.
Я бы хотелдобавить улучшение, которое изменяет ход видео в соответствии с выбранным пользователем слайдом.
Это работает почти.В тот момент, когда пользователь скользит по тексту, видео продвигается хорошо до желаемого времени.Но проблема в том, что поток работает параллельно, он немедленно заменяет текст и последовательность видео.
Вот часть моего кода (снова черновик):
abstract class VideoStepActivity : AppCompatActivity() {
companion object {
const val PAUSE_TIME_BETWEEN_ACQUISITIONS: Long = 300
}
private lateinit var mViewPager: CustomViewPager
private var mIsRunning: Boolean = true
private var mCurrentStepKey: Int = -1
protected abstract val stepNumber: Int
private lateinit var myVideoView: VideoView
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.setContentView(R.layout.activity_video_step)
}
protected fun setUpStepResources(videoFileId: Int, stepStringArray: List<Step>) {
val videoPath = "android.resource://${this.packageName}/" + videoFileId
this.myVideoView = this.findViewById(R.id.myVideoView) as VideoView
val mediaController = MediaController(this)
val uri: Uri = Uri.parse(videoPath)
this.myVideoView.setVideoURI(uri)
this.myVideoView.setMediaController(mediaController)
mediaController.setAnchorView(this.myVideoView)
this.mViewPager = this.findViewById(R.id.pager)
val pagerAdapter = this.ScreenSlidePagerAdapter(this.supportFragmentManager, stepStringArray)
this.mViewPager.adapter = pagerAdapter
this.setUpVideoStep(stepStringArray)
stepChecker(0, stepStringArray)
}
private fun setUpVideoStep(stepStringArray: List<Step>) {
this.myVideoView.setOnPreparedListener { mediaPlayer ->
mediaPlayer.isLooping = true
mediaPlayer.start()
this.mIsRunning = true
val duration = this.myVideoView.duration
this.mViewPager.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
override fun onPageSelected(position: Int) {
this@VideoStepActivity.mCurrentStepKey = position
this@VideoStepActivity.myVideoView.seekTo(stepStringArray[position].startTime)
}
override fun onPageScrollStateChanged(state: Int) {}
})
Thread(Runnable {
do {
this.mViewPager.post {
val time = this.myVideoView.currentPosition / 1000
this.stepChecker(time, stepStringArray)
}
Thread.sleep(PAUSE_TIME_BETWEEN_ACQUISITIONS)
} while (this.mIsRunning)
}).start()
}
}
private fun stepChecker(time: Int, stepStringArray: List<Step>) {
for (step: Step in stepStringArray) {
if (step.currentTimeIsInRange(time)) {
if (this.mCurrentStepKey != step.stepKey) {
this.mViewPager.currentItem = step.stepKey
this.mCurrentStepKey = step.stepKey
}
}
}
}
public override fun onDestroy() {
this.mIsRunning = false
super.onDestroy()
}
private inner class ScreenSlidePagerAdapter(fragmentManager: FragmentManager, private var stepStringArray: List<Step>) : FragmentStatePagerAdapter(fragmentManager) {
override fun getCount(): Int = this@VideoStepActivity.stepNumber
override fun getItem(position: Int): Fragment = ScreenSlidePageFragment(this.stepStringArray[position].stepString)
}
inner class Step(val stepString: String, val startTime: Int, private val endTime: Int, val stepKey: Int) {
fun currentTimeIsInRange(time: Int): Boolean {
return time in startTime..(endTime - 1)
}
}
}
Iиметь текстовый список, связанный со временем.В другом потоке каждые 300 мс я проверяю, что прогресс видео находится в диапазоне, чтобы изменить выбранный элемент моего слайдера.
Я пытался изменить ход видео в соответствии с выбранным элементом слайдераиспользуя: ViewPager.OnPageChangeListener с onPageSelected.
У вас есть какие-либо решения или улучшения для моей проблемы?