設置四個變數代表時、分、秒
var ms = 0
var s = 0
var m = 0
var h = 0
要將時、分、秒、毫秒四個變數,用計時器的格式顯示到一個TextView,可以把四個變數轉成字串後合併
textview.text = "$h:$m:$s.$ms"
如果要讓每個數字都顯示兩位,在前面用0補齊,要加入四個if()
才能辦到,程式碼會變得太複雜
使用format("")
可以簡化這個步驟
format("")
使用format("")
可以在""
中預留變數的位置,並將變數依照順序和型別合併入字串中
例如:
%d
表示整數%f
表示浮點數%c
表示字元%s
表示字串textview.text = String.format("%d:%d:%d.%d",h,m,s,ms)
為了讓文字整齊排列,可以在%
的右邊加上數字,代表至少顯示多少位,當顯示的字元不足時用空白補齊
textview.text = String.format("%2d:%2d:%2d.%2d",h,m,s,ms)
在%
的右邊多補上一個0,代表用0補齊字串
textview.text = String.format("%02d:%02d:%02d.%02d",h,m,s,ms)
在沒有特別設計的狀況下,所有的任務都會在Main Thread(UI Thread)中執行,若是遇到較耗時的的任務,就可能使畫面無法更新導致錯誤
非同步執行可以將一些可能耗費較長時間的任務,放到Background Thread執行,以防錯誤產生
Background Thread無法對畫面進行更新,所以需要對畫面進行操作時,要用Message類別和Handler類別對畫面進行操作
//建立Handler物件
private val handler = Handler(Handler.Callback { msg->
//判斷訊息進行操作
when (msg.what){
1 -> {
//更新textView
textView.text = String.format("%02d:%02d:%02d.%02d",h,m,s,ms)
}
}
true
})
private fun timer() {
Thread(Runnable {
//不斷進行迴圈 直到暫停的按鈕被按下
//mode是外部變數 0時代表暫停 1時代表繼續計時
while (mode != 0) {
//延遲0.01秒(10毫秒)
Thread.sleep(10)
ms++
if (ms == 100) {
ms = 0
s++
}
if (s == 60) {
s = 0
m++
}
if (m == 60) {
m = 0
h++
}
//建立Message物件
val msg = Message()
//設置訊息
msg.what = 1
//傳送訊息給Handler
handler.sendMessage(msg)
}
}).start()
}
對兩個按鈕進行監聽
button1.setOnClickListener {
if (mode == 0) {
mode = 1
button1.setText("暫停")
//開始計時
timer()
} else {
mode = 0
button1.setText("開始")
}
}
button2.setOnClickListener {
//只有暫停狀態時才執行
if(mode!=1){
//將數值歸零
ms=0
s=0
m=0
h=0
textView.text = String.format("%02d:%02d:%02d.%02d",h,m,s,ms)
}
}