diff --git a/sky/sdk/lib/animation/forces.dart b/sky/sdk/lib/animation/forces.dart new file mode 100644 index 0000000000000..d1dae9840f221 --- /dev/null +++ b/sky/sdk/lib/animation/forces.dart @@ -0,0 +1,34 @@ +// 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; + + Simulation release(double position, double velocity) { + // 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 = velocity < 0.0 ? + this.left - _kEpsilon : this.right + _kEpsilon; + return new SpringSimulation(spring, position, target, velocity); + } +} + +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;