Commit f167efba authored by Hans Muller's avatar Hans Muller Committed by GitHub

Tweaked scroll simulation for iOS platform (#6334)

parent 71f44f33
......@@ -11,7 +11,6 @@ library physics;
export 'src/physics/clamped_simulation.dart';
export 'src/physics/friction_simulation.dart';
export 'src/physics/gravity_simulation.dart';
export 'src/physics/scroll_simulation.dart';
export 'src/physics/simulation_group.dart';
export 'src/physics/simulation.dart';
export 'src/physics/spring_simulation.dart';
......
......@@ -8,15 +8,9 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/physics.dart';
import 'package:meta/meta.dart';
export 'package:flutter/foundation.dart' show TargetPlatform;
const double _kScrollDragMountainView = 0.025;
const double _kScrollDragCupertino = 0.125;
final SpringDescription _kScrollSpring = new SpringDescription.withDampingRatio(mass: 0.5, springConstant: 100.0, ratio: 1.1);
import 'scroll_simulation.dart';
Simulation _createScrollSimulation(double position, double velocity, double minScrollOffset, double maxScrollOffset, double scrollDrag) {
return new ScrollSimulation(position, velocity, minScrollOffset, maxScrollOffset, _kScrollSpring, scrollDrag);
}
export 'package:flutter/foundation.dart' show TargetPlatform;
Simulation _createSnapScrollSimulation(double startOffset, double endOffset, double startVelocity, double endVelocity) {
return new FrictionSimulation.through(startOffset, endOffset, startVelocity, endVelocity);
......@@ -69,20 +63,6 @@ abstract class ScrollBehavior<T, U> {
/// Whether this scroll behavior currently permits scrolling.
bool get isScrollable => true;
/// The scroll drag constant to use for physics simulations created by this
/// ScrollBehavior.
double get scrollDrag {
assert(platform != null);
switch (platform) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
return _kScrollDragMountainView;
case TargetPlatform.iOS:
return _kScrollDragCupertino;
}
return null;
}
@override
String toString() {
List<String> description = <String>[];
......@@ -220,8 +200,12 @@ class UnboundedBehavior extends ExtentScrollBehavior {
@override
Simulation createScrollSimulation(double position, double velocity) {
return new BoundedFrictionSimulation(
scrollDrag, position, velocity, double.NEGATIVE_INFINITY, double.INFINITY
return new ScrollSimulation(
position: position,
velocity: velocity,
leadingExtent: double.NEGATIVE_INFINITY,
trailingExtent: double.INFINITY,
platform: platform,
);
}
......@@ -259,7 +243,13 @@ class OverscrollBehavior extends BoundedBehavior {
@override
Simulation createScrollSimulation(double position, double velocity) {
return _createScrollSimulation(position, velocity, minScrollOffset, maxScrollOffset, scrollDrag);
return new ScrollSimulation(
position: position,
velocity: velocity,
leadingExtent: minScrollOffset,
trailingExtent: maxScrollOffset,
platform: platform,
);
}
@override
......
......@@ -2,10 +2,22 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'friction_simulation.dart';
import 'simulation_group.dart';
import 'simulation.dart';
import 'spring_simulation.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/physics.dart';
final SpringDescription _kScrollSpring = new SpringDescription.withDampingRatio(mass: 0.5, springConstant: 100.0, ratio: 1.1);
class _MountainViewSimulation extends FrictionSimulation {
static const double drag = 0.025;
_MountainViewSimulation({ double position, double velocity })
: super(drag, position, velocity);
}
class _CupertinoSimulation extends FrictionSimulation {
static const double drag = 0.135;
_CupertinoSimulation({ double position, double velocity })
: super(drag, position, velocity * 0.91);
}
/// Composite simulation for scrollable interfaces.
///
......@@ -26,13 +38,22 @@ class ScrollSimulation extends SimulationGroup {
/// consistent with the other arguments.
///
/// The final argument is the coefficient of friction, which is unitless.
ScrollSimulation(
ScrollSimulation({
double position,
double velocity,
this._leadingExtent,
this._trailingExtent,
this._spring,
this._drag) {
double leadingExtent,
double trailingExtent,
SpringDescription spring,
double drag,
TargetPlatform platform,
}) : _leadingExtent = leadingExtent,
_trailingExtent = trailingExtent,
_spring = spring ?? _kScrollSpring,
_drag = drag,
_platform = platform {
assert(_leadingExtent != null);
assert(_trailingExtent != null);
assert(_spring != null);
_chooseSimulation(position, velocity, 0.0);
}
......@@ -40,6 +61,7 @@ class ScrollSimulation extends SimulationGroup {
final double _trailingExtent;
final SpringDescription _spring;
final double _drag;
final TargetPlatform _platform;
bool _isSpringing = false;
Simulation _currentSimulation;
......@@ -76,7 +98,24 @@ class ScrollSimulation extends SimulationGroup {
}
if (_currentSimulation == null) {
_currentSimulation = new FrictionSimulation(_drag, position, velocity);
switch (_platform) {
case TargetPlatform.android:
case TargetPlatform.fuchsia:
_currentSimulation = new _MountainViewSimulation(
position: position,
velocity: velocity
);
break;
case TargetPlatform.iOS:
_currentSimulation = new _CupertinoSimulation(
position: position,
velocity: velocity,
);
break;
}
// No platform specified
_currentSimulation ??= new FrictionSimulation(_drag, position, velocity);
return true;
}
......
......@@ -48,6 +48,7 @@ export 'src/widgets/raw_keyboard_listener.dart';
export 'src/widgets/routes.dart';
export 'src/widgets/scroll_behavior.dart';
export 'src/widgets/scroll_configuration.dart';
export 'src/widgets/scroll_simulation.dart';
export 'src/widgets/scrollable.dart';
export 'src/widgets/scrollable_grid.dart';
export 'src/widgets/scrollable_list.dart';
......
......@@ -5,6 +5,7 @@
import 'package:test/test.dart';
import 'package:flutter/physics.dart';
import 'package:flutter/widgets.dart';
void main() {
test('test_friction', () {
......@@ -191,13 +192,27 @@ void main() {
SpringDescription spring = new SpringDescription.withDampingRatio(
mass: 1.0, springConstant: 50.0, ratio: 0.5);
ScrollSimulation scroll = new ScrollSimulation(100.0, 800.0, 0.0, 300.0, spring, 0.3);
ScrollSimulation scroll = new ScrollSimulation(
position: 100.0,
velocity: 800.0,
leadingExtent: 0.0,
trailingExtent: 300.0,
spring: spring,
drag: 0.3
);
scroll.tolerance = const Tolerance(velocity: 0.5, distance: 0.1);
expect(scroll.isDone(0.0), false);
expect(scroll.isDone(0.5), false); // switch from friction to spring
expect(scroll.isDone(3.5), true);
ScrollSimulation scroll2 = new ScrollSimulation(100.0, -800.0, 0.0, 300.0, spring, 0.3);
ScrollSimulation scroll2 = new ScrollSimulation(
position: 100.0,
velocity: -800.0,
leadingExtent: 0.0,
trailingExtent: 300.0,
spring: spring,
drag: 0.3
);
scroll2.tolerance = const Tolerance(velocity: 0.5, distance: 0.1);
expect(scroll2.isDone(0.0), false);
expect(scroll2.isDone(0.5), false); // switch from friction to spring
......@@ -208,8 +223,14 @@ void main() {
SpringDescription spring = new SpringDescription.withDampingRatio(
mass: 1.0, springConstant: 50.0, ratio: 0.5);
ScrollSimulation scroll =
new ScrollSimulation(100.0, 400.0, 0.0, double.INFINITY, spring, 0.3);
ScrollSimulation scroll = new ScrollSimulation(
position: 100.0,
velocity: 400.0,
leadingExtent: 0.0,
trailingExtent: double.INFINITY,
spring: spring,
drag: 0.3,
);
scroll.tolerance = const Tolerance(velocity: 1.0);
expect(scroll.isDone(0.0), false);
......@@ -232,7 +253,14 @@ void main() {
test('over/under scroll spring', () {
SpringDescription spring = new SpringDescription.withDampingRatio(mass: 1.0, springConstant: 170.0, ratio: 1.1);
ScrollSimulation scroll = new ScrollSimulation(500.0, -7500.0, 0.0, 1000.0, spring, 0.025);
ScrollSimulation scroll = new ScrollSimulation(
position: 500.0,
velocity: -7500.0,
leadingExtent: 0.0,
trailingExtent: 1000.0,
spring: spring,
drag: 0.025,
);
scroll.tolerance = new Tolerance(velocity: 45.0, distance: 1.5);
expect(scroll.isDone(0.0), false);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment