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 1e1164c9..34eeac6c 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 @@ -1879,12 +1879,26 @@ class LiveRoomActivity : BaseActivity(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(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 }