blob: 6353c8afc43de25dbdc3e31002026b9e5376686a [file] [log] [blame]
// 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);