我希望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)
有没有办法在科特林完全做到这一点?
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)
}
}
有什么方法可以在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)
}
}
}
它有点杂乱无章,但可以改进。