wanna be dev 🧑‍💻

Cool 하고 Sick한 개발자가 되고 싶은 uzun입니다

A.K.A. Kick-snare, hyjhyj0901, h_uz99 solvedac-logo

Android/Challenge

패스트캠퍼스 챌린지 37일차

Kick_snare 2022. 3. 1. 23:46
728x90

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에서는 시간이 흐를때마다

  1. 남은 시간을 갱신
  2. 남은 시간만큼 진행바를 갱신

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 인자로 사용자에 의한 변경감지인지, 코드로 인한 변경인지 감지 할 수 있다.

코드에 의한 변경 또한 반영한다면 타이머를 조절하는 동안 시간이 흘러가므로 예외처리를 해주도록하자

  • 진행바에 손을 올리었을 때에는 기존 인스턴스를 취소하고 비운다.
  • 타이머를 조절하고 손을 땐다면 새로운 인스턴스를 다시 생성하고 시작한다.

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

수강인증샷

 

링크

https://bit.ly/37BpXiC

 

728x90