Chronometer는 타이머 기능이 포함된 TextView입니다. 이 뷰를 쓰면 간단하게 시각적인 타이머 기능을 넣을 수 있습니다.
Base
이 View에는 base라는 속성이 있습니다. base는 언제를 기준으로 타이머를 셀 것인지 정합니다. 단위는 milliseconds입니다.
chronometer는 base부터~ 기기를 부팅한 뒤로 몇 milliseconds가 지났는지 까지를 기준으로 타이머를 카운팅합니다. 예를 들어 기기를 부팅한지 10000 ms가 지났다고 해봅시다. base는 1000ms로 설정했습니다. 그러면 타이머는 9000ms로 계산되고, 00:09가 표시됩니다. 여기서 1초가 지나면 00:10으로 표시됩니다.
기기 부팅후 몇 ms가 지났는지는 어떻게 알지?
1
SystemClock.elapsedRealtime()
으로 알아낼 수 있습니다.
간단한 카운터 만들기
Start, Stop, Reset기능이 있는 카운터를 생각해보겠습니다.
Chronometer를 layout에 배치하고 start, stop, reset버튼을 만들겠습니다.
그리고 activity class 전역에 Long타입의 변수인 pausedTime를 정의합니다. pausedTime은 잠깐 stop시켰을 때 타이머가 얼마나 지났는지 ms단위로 저장합니다. 타이머를 잠깐 멈췄다가 다시 실행할 때 base를 계산하는 식에서 사용됩니다. 초기값을 0입니다.
Start 버튼 로직
1
2
binding.chronometer.base = SystemClock.elapsedRealtime() - pausedTime
binding.chronometer.start()
타이머를 시작할 때 base를 기기 부팅후 지난 ms시간에 pausedTime을 뺀 값으로 설정하고 start합니다.
base의 기준은 SystemClock.elapsedRealtime이므로, 여기서 pausedTime를 빼면 pausedTime 부터 타이머가 시작됩니다. 물론 처음에는 0이므로 처음 start를 누르면 0부터 시작합니다.
Stop 버튼 로직
1
2
pausedTime = SystemClock.elapsedRealtime() - binding.chronometer.base
binding.chronometer.stop()
위의 코드는 stop 버튼 클릭시 로직입니다.
stop 버튼을 눌렀을 당시의 타이머가 가르키는 시각을 ms단위로 계산해서 pausedTime에 저장합니다. 저장한 뒤에 stop해서 타이머 갱신을 멈춥니다.
Reset 버튼 로직
1
2
3
pausedTime = 0
binding.chronometer.base = SystemClock.elapsedRealtime()
binding.chronometer.stop()
pausedTime을 0으로 설정하고, base도 SystemClock.elapsedRealtime으로 설정해서 타이머를 0으로 초기화합니다.