스플래시 화면 구성 중
- 앱 시작 1초 뒤에 텍스트 등장
- 텍스트는 1.5초간 fadeIn 애니메이션
- 애니메이션 종료 후 메인 화면으로 이동
위와 같은 조건을 만족해야 했다.
이에 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))
}