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) } }