void ScrollAnimationSmooth::setCurrentPosition(const FloatPoint& position) { stop(); m_horizontalData = PerAxisData(); m_horizontalData.currentPosition = position.x(); m_horizontalData.desiredPosition = m_horizontalData.currentPosition; m_verticalData = PerAxisData(); m_verticalData.currentPosition = position.y(); m_verticalData.desiredPosition = m_verticalData.currentPosition; }
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; }
void ScrollAnimationSmooth::setCurrentPosition(const FloatPoint& position) { stop(); m_horizontalData = PerAxisData(position.x(), m_horizontalData.visibleLength); m_verticalData = PerAxisData(position.y(), m_verticalData.visibleLength); }