bool ScrollAnimationSmooth::animateScroll(PerAxisData& data, double currentTime) { if (!data.startTime) return false; double lastScrollInterval = currentTime - data.lastAnimationTime; if (lastScrollInterval < minimumTimerInterval) return true; data.lastAnimationTime = currentTime; double deltaTime = currentTime - data.startTime; double newPosition = data.currentPosition; if (deltaTime > data.animationTime) { data = PerAxisData(data.desiredPosition, data.visibleLength); return false; } if (deltaTime < data.attackTime) newPosition = attackCurve(Curve::Cubic, deltaTime, data.attackTime, data.startPosition, data.attackPosition); else if (deltaTime < (data.animationTime - data.releaseTime)) newPosition = data.attackPosition + (deltaTime - data.attackTime) * data.desiredVelocity; else { // release is based on targeting the exact final position. double releaseDeltaT = deltaTime - (data.animationTime - data.releaseTime); newPosition = releaseCurve(Curve::Cubic, releaseDeltaT, data.releaseTime, data.releasePosition, data.desiredPosition); } // Normalize velocity to a per second amount. Could be used to check for jank. if (lastScrollInterval > 0) data.currentVelocity = (newPosition - data.currentPosition) / lastScrollInterval; data.currentPosition = newPosition; return true; }
// FIXME: Add in jank detection trace events into this function. bool ScrollAnimatorNone::PerAxisData::animateScroll(double currentTime) { double lastScrollInterval = currentTime - m_lastAnimationTime; if (lastScrollInterval < kMinimumTimerInterval) return true; m_lastAnimationTime = currentTime; double deltaTime = currentTime - m_startTime; double newPosition = *m_currentPosition; if (deltaTime > m_animationTime) { *m_currentPosition = m_desiredPosition; reset(); return false; } if (deltaTime < m_attackTime) newPosition = attackCurve(m_attackCurve, deltaTime, m_attackTime, m_startPosition, m_attackPosition); else if (deltaTime < (m_animationTime - m_releaseTime)) newPosition = m_attackPosition + (deltaTime - m_attackTime) * m_desiredVelocity; else { // release is based on targeting the exact final position. double releaseDeltaT = deltaTime - (m_animationTime - m_releaseTime); newPosition = releaseCurve(m_releaseCurve, releaseDeltaT, m_releaseTime, m_releasePosition, m_desiredPosition); } // Normalize velocity to a per second amount. Could be used to check for jank. if (lastScrollInterval > 0) m_currentVelocity = (newPosition - *m_currentPosition) / lastScrollInterval; *m_currentPosition = newPosition; return true; }
inline double ScrollAnimator::PerAxisData::newScrollAnimationPosition(double deltaTime) { if (deltaTime < m_attackTime) return attackCurve(m_attackCurve, deltaTime, m_attackTime, m_startPosition, m_attackPosition); if (deltaTime < (m_animationTime - m_releaseTime)) return m_attackPosition + (deltaTime - m_attackTime) * m_desiredVelocity; // release is based on targeting the exact final position. double releaseDeltaT = deltaTime - (m_animationTime - m_releaseTime); return releaseCurve(m_releaseCurve, releaseDeltaT, m_releaseTime, m_releasePosition, m_desiredPosition); }