fix(like-heart): 터치/클릭 충돌 해결 및 길이 기반 롱프레스 분기
- 1초 미만 터치 시 `handleHeartClick()` 실행되도록 수정 - 1초 경과 후에만 중앙 하트 표시 및 스케일 업데이트 시작 - ACTION_CANCEL 시 예약 러너블 취소, 중앙 하트 제거, 클릭/롱프레스 미실행 - 2초 이상 유지 시 기존 BIG HEART 트리거 로직 유지 - 가드 추가: `isLongPressBlockedByAvailability` 케이스 안전 처리 - 러너블/타이밍 추가: `showCenterHeartRunnable`, `longPressVisualStartTime`
This commit is contained in:
@@ -1879,12 +1879,26 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
||||
|
||||
// 롱프레스 트리거까지의 총 시간(2초 유지 시 BIG HEART)
|
||||
private val longPressDurationMs = 2000L
|
||||
private val centerHeartShowDelayMs = 500L
|
||||
|
||||
private val longPressScaleDurationMs get() = longPressDurationMs
|
||||
private val longPressScaleStart = 1.0f
|
||||
private val longPressScaleMax = 4.0f
|
||||
|
||||
// 0.5초 후 중앙 하트 표시 및 스케일 업데이트 시작을 위한 러너블
|
||||
private val showCenterHeartRunnable = Runnable {
|
||||
if (!isTrackingLongPress) return@Runnable
|
||||
if (isLongPressBlockedByAvailability) return@Runnable
|
||||
if (longPressCenterHeart != null) return@Runnable
|
||||
showCenterHeartForLongPress()
|
||||
longPressVisualStartTime = System.currentTimeMillis()
|
||||
updateCenterHeartScale(longPressScaleStart)
|
||||
handler.post(longPressScaleUpdateRunnable)
|
||||
}
|
||||
|
||||
// 롱프레스 진행 중 스케일 업데이트 러너블
|
||||
private var longPressVisualStartTime = 0L
|
||||
|
||||
private val longPressScaleUpdateRunnable = object : Runnable {
|
||||
override fun run() {
|
||||
if (!isTrackingLongPress) return
|
||||
@@ -1939,23 +1953,37 @@ class LiveRoomActivity : BaseActivity<ActivityLiveRoomBinding>(ActivityLiveRoomB
|
||||
isLongPressTriggered = false
|
||||
isTrackingLongPress = true
|
||||
pressStartTime = System.currentTimeMillis()
|
||||
// 중앙 하트 생성 및 초기 스케일 설정
|
||||
showCenterHeartForLongPress()
|
||||
updateCenterHeartScale(longPressScaleStart)
|
||||
handler.post(longPressScaleUpdateRunnable)
|
||||
// 0.5초 후 중앙 하트 표시 및 스케일 업데이트 시작
|
||||
handler.postDelayed(showCenterHeartRunnable, centerHeartShowDelayMs)
|
||||
true
|
||||
}
|
||||
|
||||
MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL -> {
|
||||
// 이용 불가로 인해 즉시 안내를 띄운 케이스: 클릭 위임 없이 종료
|
||||
// 이용 불가로 인해 즉시 안내를 띄운 케이스: 클릭/롱프레스 모두 미실행
|
||||
if (isLongPressBlockedByAvailability) {
|
||||
isLongPressBlockedByAvailability = false
|
||||
handler.removeCallbacks(showCenterHeartRunnable)
|
||||
handler.removeCallbacks(longPressScaleUpdateRunnable)
|
||||
removeCenterHeartForLongPress(withFade = false)
|
||||
return true
|
||||
}
|
||||
|
||||
val elapsed = System.currentTimeMillis() - pressStartTime
|
||||
val wasTriggered = isLongPressTriggered
|
||||
isTrackingLongPress = false
|
||||
// 중앙 하트 제거
|
||||
|
||||
// 예약된 작업 및 진행 중 애니메이션 취소
|
||||
handler.removeCallbacks(showCenterHeartRunnable)
|
||||
handler.removeCallbacks(longPressScaleUpdateRunnable)
|
||||
|
||||
if (event.action == MotionEvent.ACTION_UP && !wasTriggered) {
|
||||
if (elapsed < centerHeartShowDelayMs) {
|
||||
// 1초 미만: 클릭 처리
|
||||
handleHeartClick()
|
||||
}
|
||||
}
|
||||
|
||||
// 중앙 하트 제거 (표시되었을 수 있으므로)
|
||||
removeCenterHeartForLongPress(withFade = !wasTriggered)
|
||||
true
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user