void ProgrammaticScrollAnimator::tickAnimation(double monotonicTime) { if (m_runState != RunState::RunningOnMainThread) return; if (!m_startTime) m_startTime = monotonicTime; double elapsedTime = monotonicTime - m_startTime; bool isFinished = (elapsedTime > m_animationCurve->duration()); ScrollOffset offset = blinkOffsetFromCompositorOffset(m_animationCurve->getValue(elapsedTime)); notifyOffsetChanged(offset); if (isFinished) { m_runState = RunState::PostAnimationCleanup; } else if (!m_scrollableArea->scheduleAnimation()) { notifyOffsetChanged(offset); resetAnimationState(); } }
void ScrollAnimator::tickAnimation(double monotonicTime) { if (m_runState != RunState::RunningOnMainThread) return; TRACE_EVENT0("blink", "ScrollAnimator::tickAnimation"); double elapsedTime = monotonicTime - m_startTime; bool isFinished = (elapsedTime > m_animationCurve->duration()); ScrollOffset offset = blinkOffsetFromCompositorOffset( isFinished ? m_animationCurve->targetValue() : m_animationCurve->getValue(elapsedTime)); offset = m_scrollableArea->clampScrollOffset(offset); m_currentOffset = offset; if (isFinished) m_runState = RunState::PostAnimationCleanup; else getScrollableArea()->scheduleAnimation(); TRACE_EVENT0("blink", "ScrollAnimator::notifyOffsetChanged"); notifyOffsetChanged(); }