bool AndroidFlingPhysics::SampleImpl(const TimeDuration& aDelta, float* aOutVelocity) { mDurationSoFar += aDelta; if (mDurationSoFar >= mTargetDuration) { return false; } const float timeRatio = mDurationSoFar.ToSeconds() / mTargetDuration.ToSeconds(); float distanceCoef = 1.0f; float velocityCoef = 0.0f; gSplineConstants->CalculateCoefficients(timeRatio, &distanceCoef, &velocityCoef); // The caller expects the velocity in pixels per _millisecond_. *aOutVelocity = velocityCoef * mTargetDistance / mTargetDuration.ToMilliseconds(); mCurrentPos = mTargetPos * distanceCoef; ParentLayerPoint remainder = mTargetPos - mCurrentPos; const float threshold = GetThresholdForFlingEnd(); if (fabsf(remainder.x) < threshold && fabsf(remainder.y) < threshold) { return false; } return true; }