fix(live-room): BIG_HEART 메시지 수신 되면 WaterWaveView 대신 임시 하트 뷰를 중앙에 표시 후 폭발 실행
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user