From 6813a74c13fa340cb50a0f6eaae0fd5fe5d2ec34 Mon Sep 17 00:00:00 2001 From: klaus Date: Fri, 16 Jan 2026 14:38:18 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=98=ED=8A=B8=20=EC=95=A0=EB=8B=88?= =?UTF-8?q?=EB=A9=94=EC=9D=B4=EC=85=98=20=EC=9E=AC=EC=83=9D=20=EC=88=9C?= =?UTF-8?q?=EC=84=9C=20=EC=9C=A0=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomActivity.kt | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) 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 }