fix(live-room): BIG_HEART 메시지 수신 되면 WaterWaveView 대신 임시 하트 뷰를 중앙에 표시 후 폭발 실행
This commit is contained in:
@@ -1696,7 +1696,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
|||||||
handler.post {
|
handler.post {
|
||||||
addHeartMessage(nickname)
|
addHeartMessage(nickname)
|
||||||
viewModel.addHeartDonation(heartCount = message.can)
|
viewModel.addHeartDonation(heartCount = message.can)
|
||||||
addBigHeartAnimation()
|
addBigHeartAnimation(fromMessage = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2288,7 +2288,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
|||||||
}, animateDuration)
|
}, animateDuration)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun addBigHeartAnimation() {
|
private fun addBigHeartAnimation(fromMessage: Boolean = false) {
|
||||||
val heart = binding.heartWave
|
val heart = binding.heartWave
|
||||||
|
|
||||||
// 하트 물결 색상 적용 (#ff959a)
|
// 하트 물결 색상 적용 (#ff959a)
|
||||||
@@ -2299,7 +2299,43 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
|||||||
} catch (_: Throwable) {
|
} 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 {
|
val needFill: Boolean = try {
|
||||||
heart.visibility != View.VISIBLE || heart.progress < 100
|
heart.visibility != View.VISIBLE || heart.progress < 100
|
||||||
} catch (_: Throwable) {
|
} catch (_: Throwable) {
|
||||||
@@ -2324,7 +2360,7 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
|||||||
})
|
})
|
||||||
fillAnim.start()
|
fillAnim.start()
|
||||||
} else {
|
} else {
|
||||||
// 발신자 경로: 이미 중앙에 HeartWave가 떠 있고(롱프레스), 100% 상태 → 즉시 폭발
|
// 이미 중앙에 HeartWave가 떠 있고 100% 상태 → 즉시 폭발
|
||||||
explodeAndHideHeart(heart)
|
explodeAndHideHeart(heart)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user