https://stickode.tistory.com/110
조금 나에게 맞게 변형을 한 kotlin버전임
private enum class TimerStatus {
STARTED, STOPPED, PAUSED
}
private var timerStatus = TimerStatus.STOPPED
private var timeCountInMilliSeconds = (1 * 60000).toLong()
private var currentTime = (1 * 60000).toLong()
private lateinit var countDownTimer: CountDownTimer
private fun init(){
binding.imageViewPreviousCTGD.setOnClickListener {
(requireActivity() as MainActivity).replaceFragment(CalendarTodayGameFragment())
}
binding.imageViewReset.setOnClickListener {
reset()
}
binding.imageViewStartPause.setOnClickListener {
startPause()
}
}
/**
* 카운트 다운 시간을 리셋하고 재시작하는 기능
*/
private fun reset() {
stopCountDownTimer()
binding.editTextTime.text.clear()
binding.imageViewStartPause.setImageResource(R.drawable.ic_play)
timerStatus = TimerStatus.STOPPED
setProgressBarValues()
binding.editTextTime.setEnabled(true)
}
/**
* 타이머가 시작하고 멈추는 기능
*/
private fun startPause() {
//정지 상태 -> 새로 타이머를 시작할 때
if (timerStatus === TimerStatus.STOPPED) {
//시간이 제대로 세팅되면
if(setTimerValues()){
setProgressBarValues()
binding.imageViewStartPause.setImageResource(R.drawable.ic_pause)
binding.editTextTime.setEnabled(false)
timerStatus = TimerStatus.STARTED
startCountDownTimer()
}
}
//포즈였다가 재생할 때
else if(timerStatus === TimerStatus.PAUSED){
binding.imageViewStartPause.setImageResource(R.drawable.ic_pause)
timerStatus = TimerStatus.STARTED
pauseCountDownTimer()
}
//재생 중에 포즈를 누를 때
else {
binding.imageViewStartPause.setImageResource(R.drawable.ic_play)
timerStatus = TimerStatus.PAUSED
stopCountDownTimer()
}
}
/**
* 타이머에 시간이 설정 되어있는지 체크하크
* - 있는 경우 : 타이머에 시간 세팅
* - 없는 경우 : 시간을 설정해달라는 안내 토스트 메세지
*/
private fun setTimerValues() : Boolean{
var result = false
var time = 0
try{
if (!binding.editTextTime.getText().toString().isEmpty()) {
time = binding.editTextTime.getText().toString().trim().toInt()
if(time >= 60){
Toast.makeText(requireContext(),"한 경기는 1시간 이하로 진행됩니다. 쉬엄쉬엄하세요^^",Toast.LENGTH_SHORT).show()
}
else if(time == 0){
Toast.makeText(requireContext(),"시간을 설정해주세요",Toast.LENGTH_SHORT).show()
}
else{
timeCountInMilliSeconds = (time * 60 * 1000).toLong()
result = true
}
}
else{
Toast.makeText(requireContext(), "시간을 설정해주세요", Toast.LENGTH_LONG).show()
}
}
catch (e: NumberFormatException){
Toast.makeText(requireContext(),"경기시간으로 숫자를 입력하세요.",Toast.LENGTH_SHORT).show()
return result
}
return result
}
/**
* 카운트다운 시작 기능
*/
private fun startCountDownTimer() {
countDownTimer = object : CountDownTimer(timeCountInMilliSeconds, 1000) {
override fun onTick(millisUntilFinished: Long) {
currentTime = millisUntilFinished
binding.editTextTime.setText(hmsTimeFormatter(millisUntilFinished))
binding.progressBarCircle.setProgress((millisUntilFinished / 1000).toInt())
}
override fun onFinish() {
binding.editTextTime.setText(hmsTimeFormatter(timeCountInMilliSeconds))
setProgressBarValues()
binding.imageViewStartPause.setImageResource(R.drawable.ic_play)
binding.editTextTime.setEnabled(true)
timerStatus = TimerStatus.STOPPED
}
}.start()
countDownTimer.start()
}
/**
* 카운트다운 포즈 -> 재생
*/
private fun pauseCountDownTimer() {
countDownTimer = object : CountDownTimer(currentTime, 1000) {
override fun onTick(millisUntilFinished: Long) {
currentTime = millisUntilFinished
binding.editTextTime.setText(hmsTimeFormatter(millisUntilFinished))
binding.progressBarCircle.setProgress((millisUntilFinished / 1000).toInt())
}
override fun onFinish() {
binding.editTextTime.setText(hmsTimeFormatter(currentTime))
setProgressBarValues()
binding.imageViewStartPause.setImageResource(R.drawable.ic_play)
binding.editTextTime.setEnabled(true)
timerStatus = TimerStatus.STOPPED
}
}.start()
countDownTimer.start()
}
/**
* 카운트 다운 정지 및 초기화
*/
private fun stopCountDownTimer() {
countDownTimer.cancel()
}
/**
* 원형 프로그레스 바에 값 세팅
*/
private fun setProgressBarValues() {
binding.progressBarCircle.setMax(timeCountInMilliSeconds.toInt() / 1000)
binding.progressBarCircle.setProgress(timeCountInMilliSeconds.toInt() / 1000)
}
/**
* 밀리언 초를 시간으로 포멧해주는 기능
*
* @param milliSeconds
* @return HH:mm:ss 시간 포멧
*/
private fun hmsTimeFormatter(milliSeconds: Long): String? {
return java.lang.String.format("%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(milliSeconds) - TimeUnit.HOURS.toMinutes(TimeUnit.MILLISECONDS.toHours(milliSeconds)),
TimeUnit.MILLISECONDS.toSeconds(milliSeconds) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(milliSeconds)))
}
728x90
'프로그래밍 > Kotlin' 카테고리의 다른 글
[kotlin] recyclerView adapter item하나만 선택하기 (0) | 2021.09.14 |
---|---|
이중 recylerView + 이분의 adapter보면 viewbinding으로 돼있음 참고 가능 (0) | 2021.09.08 |
달력 다이얼로그 (0) | 2021.08.24 |
tabLayout Viewpager2 Fragment (0) | 2021.08.24 |
뒤로가기 2번 누르면 종료 (0) | 2021.08.23 |