diff --git a/packages/flutter/lib/src/gestures/monodrag.dart b/packages/flutter/lib/src/gestures/monodrag.dart index 15db9f3e817..b47ca050e5b 100644 --- a/packages/flutter/lib/src/gestures/monodrag.dart +++ b/packages/flutter/lib/src/gestures/monodrag.dart @@ -127,11 +127,14 @@ abstract class DragGestureRecognizer extends OneSequenceGestureRecognizer { @override void handleEvent(PointerEvent event) { assert(_state != _DragState.ready); - if (event is PointerMoveEvent) { + if (!event.synthesized + && (event is PointerDownEvent || event is PointerMoveEvent)) { final VelocityTracker tracker = _velocityTrackers[event.pointer]; assert(tracker != null); - if (!event.synthesized) - tracker.addPosition(event.timeStamp, event.position); + tracker.addPosition(event.timeStamp, event.position); + } + + if (event is PointerMoveEvent) { final Offset delta = event.delta; if (_state == _DragState.accepted) { if (onUpdate != null) { diff --git a/packages/flutter/test/gestures/drag_test.dart b/packages/flutter/test/gestures/drag_test.dart index 7b3d4b14bec..8d1e55c6f5b 100644 --- a/packages/flutter/test/gestures/drag_test.dart +++ b/packages/flutter/test/gestures/drag_test.dart @@ -261,7 +261,32 @@ void main() { timeStamp: const Duration(milliseconds: 60), synthesized: true, )); - tester.route(pointer.up(timeStamp: const Duration(milliseconds: 20))); + tester.route(pointer.up(timeStamp: const Duration(milliseconds: 70))); + expect(velocity.pixelsPerSecond.dx, moreOrLessEquals(1000.0)); + expect(velocity.pixelsPerSecond.dy, moreOrLessEquals(0.0)); + + drag.dispose(); + }); + + /// Checks that quick flick gestures with 1 down, 2 move and 1 up pointer + /// events still have a velocity + testGesture('Quick flicks have velocity', (GestureTester tester) { + final HorizontalDragGestureRecognizer drag = new HorizontalDragGestureRecognizer(); + + Velocity velocity; + drag.onEnd = (DragEndDetails details) { + velocity = details.velocity; + }; + + final TestPointer pointer = new TestPointer(1); + final PointerDownEvent down = pointer.down(const Offset(10.0, 25.0), timeStamp: const Duration(milliseconds: 10)); + drag.addPointer(down); + tester.closeArena(1); + tester.route(down); + tester.route(pointer.move(const Offset(20.0, 25.0), timeStamp: const Duration(milliseconds: 20))); + tester.route(pointer.move(const Offset(30.0, 25.0), timeStamp: const Duration(milliseconds: 30))); + tester.route(pointer.up(timeStamp: const Duration(milliseconds: 40))); + // 3 events moving by 10px every 10ms = 1000px/s. expect(velocity.pixelsPerSecond.dx, moreOrLessEquals(1000.0)); expect(velocity.pixelsPerSecond.dy, moreOrLessEquals(0.0));