尝试迭代更改按钮在屏幕上的位置 - 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()
}
我有一个按钮对象,我想让它在按下激活按钮后在屏幕上移动。 代码:
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()
}