diff --git a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt index 99760d0f..b918ab5c 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/live/room/LiveRoomActivity.kt @@ -1906,6 +1906,9 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB } } + private val bigHeartAnimationQueue = mutableListOf() + private var isBigHeartAnimating = false + @SuppressLint("ClickableViewAccessibility") private fun initLikeHeartButton() { if (!isHost) { @@ -2361,6 +2364,12 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB } private fun addBigHeartAnimation(fromMessage: Boolean = false) { + if (isBigHeartAnimating) { + bigHeartAnimationQueue.add(fromMessage) + return + } + + isBigHeartAnimating = true val heart = binding.heartWave // 하트 물결 색상 적용 (#ff959a) @@ -2463,7 +2472,13 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB // 모든 폭발이 끝난 뒤 하트 비/우박 애니메이션 시작 handler.postDelayed({ - val rainView = HeartRainView(this) + val rainView = HeartRainView(this) { + isBigHeartAnimating = false + if (bigHeartAnimationQueue.isNotEmpty()) { + val fromMessage = bigHeartAnimationQueue.removeAt(0) + addBigHeartAnimation(fromMessage) + } + } root.addView(rainView, lp) rainView.start() }, totalDuration) @@ -2629,7 +2644,16 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB // 모든 폭발이 끝난 뒤 하트 비/우박 애니메이션 시작 parentFL.postDelayed({ - val rainView = HeartRainView(context) + val rainView = HeartRainView(context) { + val activity = context as? LiveRoomActivity + activity?.let { + it.isBigHeartAnimating = false + if (it.bigHeartAnimationQueue.isNotEmpty()) { + val fromMessage = it.bigHeartAnimationQueue.removeAt(0) + it.addBigHeartAnimation(fromMessage) + } + } + } parentFL.addView(rainView, lp) rainView.start() }, totalDuration) @@ -2778,7 +2802,8 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB } private class HeartRainView( - context: Context + context: Context, + private val onAnimationEnd: (() -> Unit)? = null ) : View(context) { private data class Drop( @@ -2914,6 +2939,7 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB val finished = allLanded || (now - startTimeMs) >= maxDurationMs if (finished) { (parent as? FrameLayout)?.removeView(this) + onAnimationEnd?.invoke() return }