我有一個按鈕物件,我想在按下激活按鈕后讓它在螢屏上移動。 代碼:
override fun onCreate(saidInstanceState: Bundle? ){
super.onCreate(s 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() ','/span> target.y.toString())
handler().postDelayed({movingDot.displayData()}, 1300)
i = 3
問題是,按鈕只移動了一個單一的位置變化,并停留在那里。 文本 "物件也只顯示第一個變化,并且在 "i "每次迭代時不發生變化
。uj5u.com熱心網友回復:
你的 "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方式可以做到這一點。重要的方面是對runnable的自我參考。我找到了一種方法這里。
private lateinit var rannable: 可運行的
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()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/313080.html
標籤:
