Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions sky/packages/sky/lib/animation/forces.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,22 +13,25 @@ abstract class Force {
class SpringForce extends Force {
SpringForce(this.spring, {this.left: 0.0, this.right: 1.0});

// We overshoot the target by this distance, but stop the simulation when
// the spring gets within this distance (regardless of how fast it's moving).
// This causes the spring to settle a bit faster than it otherwise would.
static final Tolerance tolerance =
new Tolerance(velocity: double.INFINITY, distance: 0.01);

final SpringDescription spring;
// Where to put the spring's resting point when releasing left or right,
// respectively.
final double left, right;

Simulation release(double position, double velocity, Direction direction) {
// Target just past the endpoint, because the animation will stop once the
// Spring gets within the epsilon, and we want to stop at the endpoint.
double target = direction == Direction.reverse ?
this.left - _kEpsilon : this.right + _kEpsilon;
return new SpringSimulation(spring, position, target, velocity);
this.left - tolerance.distance : this.right + tolerance.distance;
return new SpringSimulation(spring, position, target, velocity)
..tolerance = tolerance;
}
}

final SpringDescription _kDefaultSpringDesc =
new SpringDescription.withDampingRatio(mass: 1.0, springConstant: 500.0, ratio: 1.0);
final SpringForce kDefaultSpringForce = new SpringForce(_kDefaultSpringDesc);

const double _kEpsilon = 0.001;