| Index: sky/framework/animation/scroll_behavior.dart
|
| diff --git a/sky/framework/animation/scroll_behavior.dart b/sky/framework/animation/scroll_behavior.dart
|
| index cea428ad67f4bd7bf4b01a329eb5809504461e77..1c456f2027d3db7e9fc39a39173f89a6f847f336 100644
|
| --- a/sky/framework/animation/scroll_behavior.dart
|
| +++ b/sky/framework/animation/scroll_behavior.dart
|
| @@ -34,15 +34,40 @@ class BoundedScrollBehavior extends ScrollBehavior {
|
| }
|
|
|
| class OverscrollBehavior extends ScrollBehavior {
|
| +
|
| + double _contentsHeight;
|
| + double get contentsHeight => _contentsHeight;
|
| + void set contentsHeight (double value) {
|
| + if (_contentsHeight != value) {
|
| + _contentsHeight = value;
|
| + // TODO(ianh) now what? what if we have a simulation ongoing?
|
| + }
|
| + }
|
| +
|
| + double _containerHeight;
|
| + double get containerHeight => _containerHeight;
|
| + void set containerHeight (double value) {
|
| + if (_containerHeight != value) {
|
| + _containerHeight = value;
|
| + // TODO(ianh) now what? what if we have a simulation ongoing?
|
| + }
|
| + }
|
| +
|
| + OverscrollBehavior({double contentsHeight: 0.0, double containerHeight: 0.0})
|
| + : _contentsHeight = contentsHeight,
|
| + _containerHeight = containerHeight;
|
| +
|
| + double get maxScroll => math.max(0.0, _contentsHeight - _containerHeight);
|
| +
|
| Simulation release(Particle particle) {
|
| System system;
|
| - if (particle.position >= 0.0) {
|
| + if ((particle.position >= 0.0) && (particle.position < maxScroll)) {
|
| if (particle.velocity == 0.0)
|
| return null;
|
| System slowdownSystem = new ParticleInBoxWithFriction(
|
| particle: particle,
|
| friction: _kScrollFriction,
|
| - box: new GeofenceBox(min: 0.0, onEscape: () {
|
| + box: new GeofenceBox(min: 0.0, max: maxScroll, onEscape: () {
|
| (system as Multisystem).transitionToSystem(new ParticleInBoxWithFriction(
|
| particle: particle,
|
| friction: _kOverscrollFriction,
|
| @@ -58,22 +83,31 @@ class OverscrollBehavior extends ScrollBehavior {
|
| }
|
|
|
| System getBounceBackSystem(Particle particle) {
|
| - return new ParticleClimbingRamp(
|
| + if (particle.position < 0.0)
|
| + return new ParticleClimbingRamp(
|
| particle: particle,
|
| box: new ClosedBox(max: 0.0),
|
| theta: _kBounceSlopeAngle,
|
| targetPosition: 0.0);
|
| + return new ParticleClimbingRamp(
|
| + particle: particle,
|
| + box: new ClosedBox(min: maxScroll),
|
| + theta: _kBounceSlopeAngle,
|
| + targetPosition: maxScroll);
|
| }
|
|
|
| double applyCurve(double scrollOffset, double scrollDelta) {
|
| double newScrollOffset = scrollOffset + scrollDelta;
|
| + // If we're overscrolling, we want move the scroll offset 2x
|
| + // slower than we would otherwise. Therefore, we "rewind" the
|
| + // newScrollOffset by half the amount that we moved it above.
|
| + // Notice that we clap the "old" value to 0.0 so that we only
|
| + // reduce the portion of scrollDelta that's applied beyond 0.0. We
|
| + // do similar things for overscroll in the other direction.
|
| if (newScrollOffset < 0.0) {
|
| - // If we're overscrolling, we want move the scroll offset 2x slower than
|
| - // we would otherwise. Therefore, we "rewind" the newScrollOffset by half
|
| - // the amount that we moved it above. Notice that we clap the "old" value
|
| - // to 0.0 so that we only reduce the portion of scrollDelta that's applied
|
| - // beyond 0.0.
|
| newScrollOffset -= (newScrollOffset - math.min(0.0, scrollOffset)) / 2.0;
|
| + } else if (newScrollOffset > maxScroll) {
|
| + newScrollOffset -= (newScrollOffset - math.max(maxScroll, scrollOffset)) / 2.0;
|
| }
|
| return newScrollOffset;
|
| }
|
|
|