如何使用 Kotlin 每秒更改 ImageView 中的图片

How to change picture in ImageView every second using Kotlin

我想让 ImageView 每 1 秒更换一次图片。我尝试使用 Handler 使用 Java-特定的解决方案,但无法正确翻译它们。

基本上我有一个图片资源列表:

    val loopImages = listOf(R.drawable.one, R.drawable.two, R.drawable.three, R.drawable.four)

并且我想每 1 秒循环更改图片。这是我目前的尝试,但没有奏效:


val handler = Handler()
val runnable = Runnable() {
    var i = 0

    fun run() {
        binding.slideImage.setImageResource(loopImages[i])
        i++
        if (i > loopImages.size - 1) {
            i = 0
        }
        handler.postDelayed({ run() }, 2000)
    }
}
handler.postDelayed(runnable, 2000)

有什么方法可以完全在 Kotlin 中完成吗?

Is there any way to do it completely in Kotlin?

不太确定你的意思 - 你的代码是用 Kotlin 语法编写的。

如果这更接近您的意思,您可以使用协程实现类似的结果,它消除了对可运行对象和处理程序的要求。

未经测试的代码,但像这样的代码应该可以工作:

private fun imageChanger(scope: CoroutineScope, images: List<Int>, target: ImageView, periodMillis : Long = 2_000): Job =
        scope.launch(Dispatchers.Main.immediate) {
            if (images.isNotEmpty()) {
                var idx = 0
                while (isActive) {
                    if(idx >= images.size) idx = 0
                    images[idx].let(target::setImageResource)
                    idx++
                    delay(periodMillis)
                }
            }
        }

有点乱,但可以改进。

private fun startSlider() {
    Handler().apply {
        val runnable = object : Runnable {
            var index = 0
            var imageView = findViewById<ImageView>(R.id.imageView)
            override fun run() {
                imageView.setImageResource(loopImages[index])
                index++
                if (index > loopImages.size - 1) {
                    index = 0
                }
                postDelayed(this, 1000)
            }
        }
        postDelayed(runnable, 1000)
    }
}