iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 5
1
Software Development

高中生Kotlin實作30天系列 第 5

Day05 計時器(Thread + 格式化字串)

  • 分享至 

  • xImage
  •  

Method

設置四個變數代表時、分、秒

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)

Thread

在沒有特別設計的狀況下,所有的任務都會在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)
    }
}

實作成果


上一篇
Day 04 貓咪鋼琴(下) (Sound Pool)
下一篇
Day 06 RGBA調色盤(SeekBar)
系列文
高中生Kotlin實作30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言