From 1af58aee4a920f020c482ac8a555823631fae6e0 Mon Sep 17 00:00:00 2001 From: Hans Muller Date: Tue, 22 Mar 2016 08:43:05 -0700 Subject: [PATCH] Fix Fast Fling Failure --- packages/flutter/lib/src/gestures/constants.dart | 4 ++-- packages/flutter/lib/src/gestures/drag.dart | 11 +++++++---- packages/flutter/lib/src/widgets/scrollable.dart | 3 +-- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/packages/flutter/lib/src/gestures/constants.dart b/packages/flutter/lib/src/gestures/constants.dart index 8637fe8bb7b..0586c2db6fa 100644 --- a/packages/flutter/lib/src/gestures/constants.dart +++ b/packages/flutter/lib/src/gestures/constants.dart @@ -78,9 +78,9 @@ const double kWindowTouchSlop = 16.0; // Logical pixels /// gesture. // TODO(ianh): Make sure nobody has their own version of this. const double kMinFlingVelocity = 50.0; // Logical pixels / second +// const Velocity kMinFlingVelocity = const Velocity(pixelsPerSecond: 50.0); -/// The maximum velocity of a touch to consider that touch to trigger a fling -/// gesture. +/// Drag gesture fling velocities are clipped to this value. // TODO(ianh): Make sure nobody has their own version of this. const double kMaxFlingVelocity = 8000.0; // Logical pixels / second diff --git a/packages/flutter/lib/src/gestures/drag.dart b/packages/flutter/lib/src/gestures/drag.dart index c3cba6cb569..ab5063cf17b 100644 --- a/packages/flutter/lib/src/gestures/drag.dart +++ b/packages/flutter/lib/src/gestures/drag.dart @@ -31,8 +31,7 @@ typedef void _GesturePolymorphicUpdateCallback(T delta); bool _isFlingGesture(Velocity velocity) { assert(velocity != null); final double speedSquared = velocity.pixelsPerSecond.distanceSquared; - return speedSquared > kMinFlingVelocity * kMinFlingVelocity - && speedSquared < kMaxFlingVelocity * kMaxFlingVelocity; + return speedSquared > kMinFlingVelocity * kMinFlingVelocity; } abstract class _DragGestureRecognizer extends OneSequenceGestureRecognizer { @@ -119,10 +118,14 @@ abstract class _DragGestureRecognizer extends OneSequenceGest assert(tracker != null); Velocity velocity = tracker.getVelocity(); - if (velocity != null && _isFlingGesture(velocity)) + if (velocity != null && _isFlingGesture(velocity)) { + final Offset pixelsPerSecond = velocity.pixelsPerSecond; + if (pixelsPerSecond.distanceSquared > kMaxFlingVelocity * kMaxFlingVelocity) + velocity = new Velocity(pixelsPerSecond: (pixelsPerSecond / pixelsPerSecond.distance) * kMaxFlingVelocity); onEnd(velocity); - else + } else { onEnd(Velocity.zero); + } } _velocityTrackers.clear(); } diff --git a/packages/flutter/lib/src/widgets/scrollable.dart b/packages/flutter/lib/src/widgets/scrollable.dart index 14f8559d53b..1f0d8bbd757 100644 --- a/packages/flutter/lib/src/widgets/scrollable.dart +++ b/packages/flutter/lib/src/widgets/scrollable.dart @@ -499,8 +499,7 @@ abstract class ScrollableState extends State { Future _handleDragEnd(Velocity velocity) { double scrollVelocity = pixelDeltaToScrollOffset(velocity.pixelsPerSecond) / Duration.MILLISECONDS_PER_SECOND; - // The gesture velocity properties are pixels/second, config min,max limits are pixels/ms - return fling(scrollVelocity.clamp(-kMaxFlingVelocity, kMaxFlingVelocity)).then(_endScroll); + return fling(scrollVelocity).then(_endScroll); } Null _endScroll([Null _]) {