Handler + CountDownTimer -> Coroutine

Hue·2024년 7월 29일
0

Android/Kotlin

목록 보기
42/42

스플래시 화면 구성 중

  1. 앱 시작 1초 뒤에 텍스트 등장
  2. 텍스트는 1.5초간 fadeIn 애니메이션
  3. 애니메이션 종료 후 메인 화면으로 이동

위와 같은 조건을 만족해야 했다.

이에 1년 전, Handler와 CountDownTimer를 이용하여 구현하였다.


    val countDownTimer = object: CountDownTimer(2500, 1000) {
        override fun onTick(p0: Long) { }
        override fun onFinish() {
            startActivity(Intent(this@IntroActivity, MainActivity::class.java))
            finish()
        }
    }
    
    // onCreate에서 호출되는 메소드
    override fun initView() { 
        Handler(Looper.getMainLooper())
            .postDelayed({
                activityBinding.tvIntro.visibility = View.VISIBLE
                val fadeIn = ObjectAnimator.ofFloat(activityBinding.tvIntro, "alpha", 0f, 1f)
                fadeIn.duration = 1500
                fadeIn.start()
        }, 1000)
    }

당시에 나름대로 열심히 짱구를 굴린 방법이었다...
Handler를 이용해 1초 대기 후 1.5초간 fadeIn되는 애니메이션을 재생하고, 도합 2.5초를 CountDownTimer로 파악 후 타이머가 종료되면 화면 이동을 실행하도록 하였다.

코루틴으로 다음과 같이 바꿀 수 있다.
이때, Dispatcher.Main 은 UI와 상호작용 작업을 하는 dispatcher 이다.

        CoroutineScope(Dispatchers.Main).launch {
            delay(1000)
            val text = binding.tvSplashMessage
            val fadeIn = ObjectAnimator.ofFloat(text,"alpha", 0f, 1f)
            fadeIn.duration = 1500
            fadeIn.start()
            delay(1500)
            startActivity(Intent(this@SplashActivity, MainActivity::class.java))
        }

먼저 delay 1초 후 -> fade In 애니메이션 1.5초 진행, delay 1.5초 -> 메인 화면 이동

근데 누수 방지를 위해 CoroutineScope(Dispatchers.Main) 대신 lifecycleScope 이용
사실 코루틴 아직 잘 몰라서 이 부분은 다음 포스트에 정리해서 올릴 예정

       lifecycleScope.launch {
            delay(1000)
            val text = binding.tvSplashMessage
            val fadeIn = ObjectAnimator.ofFloat(text,"alpha", 0f, 1f)
            fadeIn.duration = 1500
            fadeIn.start()
            delay(1500)
            startActivity(Intent(this@SplashActivity, MainActivity::class.java))
        }

0개의 댓글