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