Как настроить таймеры на повторение трех функций (отображение картинки в изображении) каждый определенный промежуток времени? - PullRequest
0 голосов
/ 27 сентября 2019

Так что в настоящее время я делаю Pokédex для моей стажировки.У меня это работает по большей части, но есть пара вещей, которые мне нужно исправить, включая вопрос, заданный выше.У меня есть функция Eeveelutions, которая должна запускать три другие функции, которые называются showVaporeon, showJolteon и showFlareon.Они должны бегать по 3 секунды каждый, а затем просто кружить, пока человек, использующий покедекс, не перейдет к следующему или предыдущему покемону.В чем я нуждаюсь, так это в том, как мне установить таймер (если это лучший способ сделать это) для запуска этих функций.Итак, покажите Vaporeon в течение 3 секунд, затем покажите Jolteon в течение 3 секунд, затем Flareon в течение 3 секунд и повторите.Я искал множество вопросов, чтобы найти свое решение, но пока не могу найти его, и большая часть его не в kotlin.

Итак, есть ли кто-нибудь, у кого есть простой пример для меня или лучшее решение(и пример), затем используя таймер.

Поиск на форуме решений, перепутанных с таймерами, перепутанных с потоками, но пока решений нет

fun showVaporeon(){
        evoChart2.visibility = View.VISIBLE
        Glide.with(this).load(imageBaseURL + "134" + ".png").into(evoChart2)
        evolveOption2.text = "Vaporeon"
        evolveOption2.text = ""
        evoChart2.visibility = View.GONE
    }

    fun showJolteon(){
        evoChart2.visibility = View.VISIBLE
        Glide.with(this).load(imageBaseURL + "135" + ".png").into(evoChart2)
        evolveOption2.text = "Jolteon"
        evolveOption2.text = ""
        evoChart2.visibility = View.GONE
    }

    fun showFlareon(){
        evoChart2.visibility = View.VISIBLE
        Glide.with(this).load(imageBaseURL + "136" + ".png").into(evoChart2)
        evolveOption2.text = "Flareon"
        evolveOption2.text = ""
        evoChart2.visibility = View.GONE
    }

Так что я хотел бы evoChart2 (которыйодно из трех изображений, которые у меня есть), чтобы показать Vaporeon в течение 3 секунд, затем Jolteon в течение 3 секунд, затем Flareon в течение 3 секунд, а затем снова Vaporeon в течение 3 секунд, Jolteon, Flareon и т. д.

1 Ответ

4 голосов
/ 27 сентября 2019

Поскольку вы хотите цикл, я бы предложил использовать список, чтобы упростить итерацию и добавить больше покемонов в будущем.

Создайте класс данных Pokemon, если у вас его еще нет.

data class Pokemon(val name: String, val imageUrl: String)

Создайте столько экземпляров этого класса, сколько вам нужно, и добавьте их в список.

val pokemonList: List<Pokemon> = listOf(vaporeon, jolteon, flareon)

Нам также нужно будет сохранить индекс текущего покемона, которого мыОтображаем

val currentIndex = 0

Затем мы создадим Runnable и запланируем его выполнение каждые три секунды, вы можете захотеть сделать это в onResume.

val service = Executors.newSingleThreadScheduledExecutor()
service.scheduleAtFixedRate({ displayPokemon() }, 0, 3, TimeUnit.SECONDS)

Теперь создайте displayPokemonфункция, которая будет вызываться каждые 3 секунды.

fun displayPokemon() {
}

Внутри этой функции нам нужно знать, каким будет следующий отображаемый нами покемон, основываясь на текущем покемоне.

val next = currentIndex + 1
if (next >= pokemonList.size) {
     // we're at the end, go back to 0
     currentIndex = 0
} else {
     currentIndex = next
}

val pokemon = pokemonList[currentIndex]

Теперь, когда у нас появился следующий покемон, мы можем использовать его для заполнения представления

evoChart2.visibility = View.VISIBLE
Glide.with(this).load(pokemon.imageUrl).into(evoChart2)
evolveOption2.text = pokemon.name
evolveOption2.text = ""
evoChart2.visibility = View.GONE

Наконец, мы не хотим, чтобы это происходило, когда действие / фрагмент находится в фоновом режиме, поэтому мы добавляемследующий код для onPause

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