From a52f9425e83df346448c11e477773bcdad4860c9 Mon Sep 17 00:00:00 2001 From: klaus Date: Thu, 6 Nov 2025 15:08:00 +0900 Subject: [PATCH] =?UTF-8?q?fix(live-room):=20BIG=5FHEART=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=88=98=EC=8B=A0=20=EB=90=98=EB=A9=B4=20?= =?UTF-8?q?WaterWaveView=20=EB=8C=80=EC=8B=A0=20=EC=9E=84=EC=8B=9C=20?= =?UTF-8?q?=ED=95=98=ED=8A=B8=20=EB=B7=B0=EB=A5=BC=20=EC=A4=91=EC=95=99?= =?UTF-8?q?=EC=97=90=20=ED=91=9C=EC=8B=9C=20=ED=9B=84=20=ED=8F=AD=EB=B0=9C?= =?UTF-8?q?=20=EC=8B=A4=ED=96=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomActivity.kt | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 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 84377768..0308a829 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 @@ -1696,7 +1696,7 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB handler.post { addHeartMessage(nickname) viewModel.addHeartDonation(heartCount = message.can) - addBigHeartAnimation() + addBigHeartAnimation(fromMessage = true) } } @@ -2288,7 +2288,7 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB }, animateDuration) } - private fun addBigHeartAnimation() { + private fun addBigHeartAnimation(fromMessage: Boolean = false) { val heart = binding.heartWave // 하트 물결 색상 적용 (#ff959a) @@ -2299,7 +2299,43 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB } catch (_: Throwable) { } - // 수신자 경로: heartWave가 없거나 progress<100이면 1초간 물 채우기 후 폭발 + // 메시지로 수신된 경우: WaterWaveView 대신 임시 하트 뷰를 중앙에 표시 후 폭발 실행 + if (fromMessage) { + val root = binding.flRoot + // 임시 하트(ImageView) 생성 및 중앙 배치 + val tempHeart = ImageView(this).apply { + setImageResource(R.drawable.ic_heart_pink) + alpha = 0f + scaleX = 0.8f + scaleY = 0.8f + layoutParams = FrameLayout.LayoutParams( + 120f.dpToPx().toInt(), + 120f.dpToPx().toInt() + ).apply { + gravity = android.view.Gravity.CENTER + } + } + root.addView(tempHeart) + + // 짧은 페이드/스케일 인 후 폭발 실행 (레이아웃 완료 보장 위해 애니메이션 콜백에서 처리) + tempHeart.animate() + .alpha(1f) + .scaleX(1f) + .scaleY(1f) + .setDuration(150L) + .withEndAction { + // 임시 하트를 기준으로 폭발 위치 계산 및 실행 + explodeAndHideHeart(tempHeart) + // 누적 방지: 일정 시간 후 임시 하트 제거 + handler.postDelayed({ + (tempHeart.parent as? FrameLayout)?.removeView(tempHeart) + }, 1200L) + } + .start() + return + } + + // 발신/롱프레스 등 로컬 트리거: heartWave가 보이지 않거나 진행도가 100 미만이면 1초간 물 채우기 후 폭발 val needFill: Boolean = try { heart.visibility != View.VISIBLE || heart.progress < 100 } catch (_: Throwable) { @@ -2324,7 +2360,7 @@ class LiveRoomActivity : BaseActivity(ActivityLiveRoomB }) fillAnim.start() } else { - // 발신자 경로: 이미 중앙에 HeartWave가 떠 있고(롱프레스), 100% 상태 → 즉시 폭발 + // 이미 중앙에 HeartWave가 떠 있고 100% 상태 → 즉시 폭발 explodeAndHideHeart(heart) } }