fix(live-room): BIG_HEART 메시지 수신 되면 WaterWaveView 대신 임시 하트 뷰를 중앙에 표시 후 폭발 실행

This commit is contained in:
2025-11-06 15:08:00 +09:00
parent 48eb959ab2
commit a52f9425e8

View File

@@ -1696,7 +1696,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
handler.post {
addHeartMessage(nickname)
viewModel.addHeartDonation(heartCount = message.can)
addBigHeartAnimation()
addBigHeartAnimation(fromMessage = true)
}
}
@@ -2288,7 +2288,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
}, animateDuration)
}
private fun addBigHeartAnimation() {
private fun addBigHeartAnimation(fromMessage: Boolean = false) {
val heart = binding.heartWave
// 하트 물결 색상 적용 (#ff959a)
@@ -2299,7 +2299,43 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(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<ActivityLiveRoomBinding>(ActivityLiveRoomB
})
fillAnim.start()
} else {
// 발신자 경로: 이미 중앙에 HeartWave가 떠 있고(롱프레스), 100% 상태 → 즉시 폭발
// 이미 중앙에 HeartWave가 떠 있고 100% 상태 → 즉시 폭발
explodeAndHideHeart(heart)
}
}