如何使用 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)
}
}
我想让 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)
}
}