Искать положение в видеоизображении в зависимости от выбранного ползунка (и наоборот) - PullRequest
0 голосов
/ 12 апреля 2019

Я настраиваю 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.

У вас есть какие-либо решения или улучшения для моей проблемы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...