package com.meiyou.period.effect import android.view.HapticFeedbackConstants import android.view.View class PeriodBloodFlowCoordinator(private val rootView: View) { enum class State { Idle, RequiredSheet, Animating, Analysis, Complete } private var state = State.Idle private var calendarLocked = false private val baseFillDuration = 125L private val durationUnit = 5.3 private val previewHold = 115L private val overlapRatio = 0.35 private val minStaggerGap = 118L private val settleHold = 170L private val settleDuration = 360L fun onTapYes(periodRange: PeriodRange) { rootView.performHapticFeedback(HapticFeedbackConstants.LONG_PRESS) // 先展示白底中间态和黄色开始 icon;血流等弹窗确定后再播放。 showWhitePreviewState(periodRange) showStartIcon(periodRange) state = State.RequiredSheet showRequiredPeriodSheet( onConfirm = { confirmRequiredSheet(periodRange) }, onCancel = { cancelRequiredSheet() } ) } fun onTapNo() { // 点击否不调用震动能力。 cancelPendingFlow() restoreUnrecordedState() state = State.Idle } private fun confirmRequiredSheet(periodRange: PeriodRange) { hideRequiredPeriodSheet() expandTodayRecordList() calendarLocked = true state = State.Animating playBloodFlow(periodRange) { state = State.Analysis showAnalysisBubble { state = State.Complete calendarLocked = false } } } private fun cancelRequiredSheet() { hideRequiredPeriodSheet() restoreUnrecordedState() state = State.Idle } fun onCalendarDateTap(date: Long) { if (calendarLocked) return selectDate(date) } private fun durationFor(level: Int): Long = (baseFillDuration + level * durationUnit).toLong() } data class PeriodRange(val dayCount: Int)