37일차
30개 프로젝트로 배우는 Android 앱 개발 with Kotlin 초격차 패키지 Online
강의 목표
- 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
- 프로젝트를 따라해보며 앱개발에 필요한 기술을 학습할 수 있습니다.
- 앱 개발시 원하는 기능을 구현하기 위해 어떤 기술이 필요한 지 알 수 있습니다.
- 디자인 아키텍처 패턴, 비동기 처리 등 효율적인 앱 개발 방법을 익힐 수 있습니다.
목차 02 Basic - Ch06. 뽀모도로 타이머
인트로기본 UI 구성하기- 타이머 기능 구현하기
- 효과음 추가하기
- 완성도 높이기
타이머 기능 구현하기
저번 포스팅에서는 뷰를 불러오고, Seek Bar의 핸들러를 불러와서 타이머의 분 영역을 갱신할 수 있는 코드를 짜보았다. 이번 포스팅에서는 타이머 기능을 구현하기 위해 타이머 객체를 생성하고 진행바 조절에 따라 타이머를 조절할 수 있는 코드를 짜보도록 하자
먼저 CountDownTimer 객체를 만들어 타이머를 생성하도록 하자.
인스턴스를 만들기 위해 object 키워드로 싱글톤으로 쉽게 생성 가능하다.
private fun createCountDownTimer(initialMillis: Long) =
object : CountDownTimer(initialMillis, 1000L) {
override fun onTick(millisUntilFinished: Long) {
updateRemainTime(millisUntilFinished)
updateSeekBar(millisUntilFinished)
}
override fun onFinish() {
updateRemainTime(0)
updateRemainTime(0)
}
}
CountDownTimer는 추상클래스이기 때문에 이를 상속하여 구현해주도록하자
onTick에서는 시간이 흐를때마다
- 남은 시간을 갱신
- 남은 시간만큼 진행바를 갱신
onFinish에서는 타이머가 종료되면 진행바와 남은 시간을 모두 초기화 해주면 된다.
private fun updateRemainTime(remainMillis: Long) {
val remainSeconds = remainMillis / 1000
remainMinutesTextView.text = "%02d".format(remainSeconds / 60)
remainSecondsTextView.text = "%02d".format(remainSeconds % 60)
}
private fun updateSeekBar(remainMillis: Long) {
seekBar.progress = (remainMillis / 1000 / 60).toInt()
}
시간은 모두 밀리초 기준이므로 1000을 곱하거나 나누어 줘야함을 잊지 말자.
이전에 bindViews 함수의 진행바 핸들러를 마저 채우도록 하자
seekBar.setOnSeekBarChangeListener (
object : SeekBar.OnSeekBarChangeListener{
override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
if(fromUser) updateRemainTime(progress * 60 * 1000L)
}
override fun onStartTrackingTouch(p0: SeekBar?) { // 조절바에 손가락을 올렸을 때
currentCountDownTimer?.cancel()
currentCountDownTimer = null
}
override fun onStopTrackingTouch(seekBar: SeekBar?) { // 조절바에서 터치를 때는 순간
seekBar ?: return
currentCountDownTimer = createCountDownTimer(seekBar.progress * 60 * 1000L)
currentCountDownTimer?.start()
}
}
)
첫번째로 조절바가 바뀌었을 때 코드가 바뀌었다.
fromUser 인자로 사용자에 의한 변경감지인지, 코드로 인한 변경인지 감지 할 수 있다.
코드에 의한 변경 또한 반영한다면 타이머를 조절하는 동안 시간이 흘러가므로 예외처리를 해주도록하자
- 진행바에 손을 올리었을 때에는 기존 인스턴스를 취소하고 비운다.
- 타이머를 조절하고 손을 땐다면 새로운 인스턴스를 다시 생성하고 시작한다.
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
수강인증샷
링크
'Android > Challenge' 카테고리의 다른 글
패스트캠퍼스 챌린지 39일차 (0) | 2022.03.03 |
---|---|
패스트캠퍼스 챌린지 38일차 (0) | 2022.03.02 |
패스트캠퍼스 챌린지 36일차 (0) | 2022.02.28 |
패스트캠퍼스 챌린지 35일차 (0) | 2022.02.27 |
패스트캠퍼스 챌린지 34일차 (0) | 2022.02.26 |