아카이빙/Kotlin

자바이긴 하지만 이거보고 집가서 만들어보기 지금 화면은 너무 쪼꼬매서 하기 힘드렁ㅠ

seojeon9 2021. 8. 25. 15:18

https://stickode.tistory.com/110

 

[JAVA][Android] 원형 프로그레스바 타이머

안녕하세요 ~ 오늘은 타이머를 만들어 볼건데요 그냥 타이머가 아니라 시간이 지남에따라, 원형 프로그레스 바가 움직이는 타이머를 만들어볼꺼에요 그럼 바로 시작하겠습니다 :) 스틱코드란 ?

stickode.tistory.com

 

조금 나에게 맞게 변형을 한 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