| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| import 'package:newton/newton.dart'; |
| |
| // Base class for creating Simulations for the animation Timeline. |
| abstract class Force { |
| Simulation release(double position, double velocity); |
| } |
| |
| class SpringForce extends Force { |
| SpringForce(this.spring, { this.left: 0.0, this.right: 1.0 }); |
| |
| final SpringDescription spring; |
| |
| // Where to put the spring's resting point when releasing left or right, |
| // respectively. |
| final double left, right; |
| |
| // 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 |
| ); |
| |
| Simulation release(double position, double velocity) { |
| double target = velocity < 0.0 ? 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); |