尝试迭代更改按钮在屏幕上的位置 - kotlin android studio

trying to iteratively change the location of a button on screen - kotlin android studio

我有一个按钮对象,我想让它在按下激活按钮后在屏幕上移动。 代码:

override fun onCreate(savedInstanceState: Bundle?) {
  super.onCreate(savedInstanceState)
  setContentView(R.layout.activity_main)
  val target: Button = findViewById(R.id.target)
  val text: TextView = findViewById(R.id.textView)
  val start: Button = findViewById(R.id.start_rec)
  start.setOnClickListener{
     var i:Float =1F
     while (i<360){
            target.x = new_x_position(i)
            target.y = new_y_position(i)
            text.setText = (target.x.toString()+','+target.y.toString())
            handler().postDelayed({movingDot.displayData()}, 1300)
            i += 3
           }
        }
     }

问题是按钮只移动了一次位置变化并停留在那里。 “文本”对象也仅显示第一次更改,并且在每次迭代“i”更改时都不会更改

您的“while”循环是 运行 一次全部执行并堆叠要执行的代码,这些代码将在 1.3 秒内一个接一个地执行。尽管您期望执行的所有操作都执行了,但时机已到。您可能还会遇到更改视图位置的其他问题。

这是一个模板,展示了如何每 250 毫秒更改 TextView 的内容。 Runnable 的每次执行都会对 TextView 进行更改,检查限制,如果未达到限制,则将自身重新发布到消息队列以在 250 毫秒后执行.

您应该能够将此代码用作您需要执行的操作的模板。

val start: Button = findViewById(R.id.start_rec)

start.setOnClickListener {
    val changingView = findViewById<TextView>(R.id.changingView)
    object : Runnable {
        private var i = 0
        override fun run() {
            if (++i <= 10) {
                changingView.text = "$i"
                Handler(Looper.getMainLooper()).postDelayed(this, 250)
            }
        }
    }.run()
}

上述方法可行,但我想知道是否有更惯用的 Kotlin 方法来执行此操作。重要的方面是对可运行对象的自引用。我找到了一个方法 .

private lateinit var runnable: Runnable

init {
    var i = 0
    runnable = Runnable {
        val changingView = findViewById<TextView>(R.id.changingView)
        if (++i <= 10) {
            changingView.text = "$i"
            Handler(Looper.getMainLooper()).postDelayed(runnable, 250)
        }
    }
}

start.setOnClickListener {
    runnable.run()
}