bool Axis::SampleOverscrollAnimation(const TimeDuration& aDelta) { mMSDModel.Simulate(aDelta); mOverscroll = mMSDModel.GetPosition(); if (mMSDModel.IsFinished(1.0)) { // "Jump" to the at-rest state. The jump shouldn't be noticeable as the // velocity and overscroll are already low. AXIS_LOG("%p|%s oscillation dropped below threshold, going to rest\n", mAsyncPanZoomController, Name()); ClearOverscroll(); mVelocity = 0; return false; } // Otherwise, continue the animation. return true; }
bool Axis::SampleOverscrollAnimation(const TimeDuration& aDelta) { // Short-circuit early rather than running through all the sampling code. if (mVelocity == 0.0f && mOverscroll == 0.0f) { return false; } // We approximate the curve traced out by the velocity of the spring // over time by breaking up the curve into small segments over which we // consider the velocity to be constant. If the animation is sampled // sufficiently often, then treating |aDelta| as a single segment of this // sort would be fine, but the frequency at which the animation is sampled // can be affected by external factors, and as the segment size grows larger, // the approximation gets worse and the approximated curve can even diverge // (i.e. oscillate forever, with displacements of increasing absolute value)! // To avoid this, we break up |aDelta| into smaller segments of length 1 ms // each, and a segment of any remaining fractional milliseconds. double milliseconds = aDelta.ToMilliseconds(); int wholeMilliseconds = (int) aDelta.ToMilliseconds(); double fractionalMilliseconds = milliseconds - wholeMilliseconds; for (int i = 0; i < wholeMilliseconds; ++i) { StepOverscrollAnimation(1); } StepOverscrollAnimation(fractionalMilliseconds); // If both the velocity and the displacement fall below a threshold, stop // the animation so we don't continue doing tiny oscillations that aren't // noticeable. if (fabs(mOverscroll) < gfxPrefs::APZOverscrollStopDistanceThreshold() && fabs(mVelocity) < gfxPrefs::APZOverscrollStopVelocityThreshold()) { // "Jump" to the at-rest state. The jump shouldn't be noticeable as the // velocity and overscroll are already low. AXIS_LOG("%p|%s oscillation dropped below threshold, going to rest\n", mAsyncPanZoomController, Name()); ClearOverscroll(); mVelocity = 0; return false; } // Otherwise, continue the animation. return true; }
void Axis::StopSamplingOverscrollAnimation() { ParentLayerCoord overscroll = GetOverscroll(); ClearOverscroll(); mOverscroll = overscroll; }