diff --git a/dev/manual_tests/overlay_geometry.dart b/dev/manual_tests/overlay_geometry.dart index 53a354b84d..4f5495053f 100644 --- a/dev/manual_tests/overlay_geometry.dart +++ b/dev/manual_tests/overlay_geometry.dart @@ -108,7 +108,7 @@ class CardBuilder extends LazyBlockDelegate { CardModel cardModel = cardModels[index]; return new GestureDetector( key: cardModel.key, - onTapUp: (Point globalPosition) { onTapUp(cardModel.targetKey, globalPosition); }, + onTapUp: (TapUpDetails details) { onTapUp(cardModel.targetKey, details.globalPosition); }, child: new Card( key: cardModel.targetKey, color: cardModel.color, diff --git a/packages/flutter/lib/src/gestures/drag.dart b/packages/flutter/lib/src/gestures/drag.dart index 649ff5e14a..c34ec7306e 100644 --- a/packages/flutter/lib/src/gestures/drag.dart +++ b/packages/flutter/lib/src/gestures/drag.dart @@ -56,7 +56,7 @@ class DragUpdateDetails { /// coordinates of [delta] and the other coordinate must be zero. DragUpdateDetails({ this.delta: Offset.zero, - this.primaryDelta: 0.0 + this.primaryDelta }) { assert(primaryDelta == null || (primaryDelta == delta.dx && delta.dy == 0.0) @@ -90,7 +90,7 @@ class DragEndDetails { /// Creates details for a [GestureDragEndCallback]. /// /// The [velocity] argument must not be null. - DragEndDetails({ this.velocity: Velocity.zero }) { + DragEndDetails({ this.velocity }) { assert(velocity != null); } @@ -100,6 +100,9 @@ class DragEndDetails { /// Signature for when a pointer that was previously in contact with the screen /// and moving is no longer in contact with the screen. +/// +/// The velocity at which the pointer was moving when it stopped contacting +/// the screen is available in the `details`. typedef void GestureDragEndCallback(DragEndDetails details); /// Signature for when the pointer that previously triggered a diff --git a/packages/flutter/lib/src/gestures/multidrag.dart b/packages/flutter/lib/src/gestures/multidrag.dart index ec061d5063..b73a5b0fc4 100644 --- a/packages/flutter/lib/src/gestures/multidrag.dart +++ b/packages/flutter/lib/src/gestures/multidrag.dart @@ -8,6 +8,7 @@ import 'dart:ui' show Point, Offset; import 'arena.dart'; import 'binding.dart'; import 'constants.dart'; +import 'drag.dart'; import 'events.dart'; import 'recognizer.dart'; import 'velocity_tracker.dart'; @@ -17,12 +18,14 @@ typedef Drag GestureMultiDragStartCallback(Point position); /// Interface for receiving updates about drags from a [MultiDragGestureRecognizer]. abstract class Drag { - /// The pointer has moved by the given offset. - void move(Offset offset) { } + /// The pointer has moved. + void update(DragUpdateDetails details) { } - /// The pointer is no longer in contact with the screen and was moving at a - /// given velocity when it stopped contacting the screen. - void end(Velocity velocity) { } + /// The pointer is no longer in contact with the screen. + /// + /// The velocity at which the pointer was moving when it stopped contacting + /// the screen is available in the `details`. + void end(DragEndDetails details) { } /// The input from the pointer is no longer directed towards this receiver. /// @@ -76,7 +79,7 @@ abstract class MultiDragPointerState { _velocityTracker.addPosition(event.timeStamp, event.position); if (_client != null) { assert(pendingDelta == null); - _client.move(event.delta); + _client.update(new DragUpdateDetails(delta: event.delta)); } else { assert(pendingDelta != null); _pendingDelta += event.delta; @@ -113,7 +116,7 @@ abstract class MultiDragPointerState { assert(client != null); assert(pendingDelta != null); _client = client; - _client.move(pendingDelta); + _client.update(new DragUpdateDetails(delta: pendingDelta)); _pendingDelta = null; } @@ -121,7 +124,7 @@ abstract class MultiDragPointerState { assert(_arenaEntry != null); if (_client != null) { assert(pendingDelta == null); - _client.end(_velocityTracker.getVelocity()); + _client.end(new DragEndDetails(velocity: _velocityTracker.getVelocity() ?? Velocity.zero)); _client = null; } else { assert(pendingDelta != null); diff --git a/packages/flutter/lib/src/gestures/multitap.dart b/packages/flutter/lib/src/gestures/multitap.dart index 50583a2bf3..738a87127b 100644 --- a/packages/flutter/lib/src/gestures/multitap.dart +++ b/packages/flutter/lib/src/gestures/multitap.dart @@ -11,6 +11,7 @@ import 'constants.dart'; import 'events.dart'; import 'pointer_router.dart'; import 'recognizer.dart'; +import 'tap.dart'; /// Signature for callback when the user has tapped the screen at the same /// location twice in quick succession. @@ -18,11 +19,11 @@ typedef void GestureDoubleTapCallback(); /// Signature used by [MultiTapGestureRecognizer] for when a pointer that might /// cause a tap has contacted the screen at a particular location. -typedef void GestureMultiTapDownCallback(Point globalPosition, int pointer); +typedef void GestureMultiTapDownCallback(int pointer, TapDownDetails details); /// Signature used by [MultiTapGestureRecognizer] for when a pointer that will /// trigger a tap has stopped contacting the screen at a particular location. -typedef void GestureMultiTapUpCallback(Point globalPosition, int pointer); +typedef void GestureMultiTapUpCallback(int pointer, TapUpDetails details); /// Signature used by [MultiTapGestureRecognizer] for when a tap has occurred. typedef void GestureMultiTapCallback(int pointer); @@ -358,7 +359,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer { longTapDelay: longTapDelay ); if (onTapDown != null) - onTapDown(event.position, event.pointer); + onTapDown(event.pointer, new TapDownDetails(globalPosition: event.position)); } @override @@ -379,7 +380,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer { _gestureMap.remove(pointer); if (resolution == _TapResolution.tap) { if (onTapUp != null) - onTapUp(globalPosition, pointer); + onTapUp(pointer, new TapUpDetails(globalPosition: globalPosition)); if (onTap != null) onTap(pointer); } else { @@ -391,7 +392,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer { void _handleLongTap(int pointer, Point lastPosition) { assert(_gestureMap.containsKey(pointer)); if (onLongTapDown != null) - onLongTapDown(lastPosition, pointer); + onLongTapDown(pointer, new TapDownDetails(globalPosition: lastPosition)); } @override diff --git a/packages/flutter/lib/src/gestures/tap.dart b/packages/flutter/lib/src/gestures/tap.dart index 0aa2f2939e..d89c3b6523 100644 --- a/packages/flutter/lib/src/gestures/tap.dart +++ b/packages/flutter/lib/src/gestures/tap.dart @@ -7,13 +7,45 @@ import 'constants.dart'; import 'events.dart'; import 'recognizer.dart'; -/// Signature for when a pointer that might cause a tap has contacted the screen -/// at a particular location. -typedef void GestureTapDownCallback(Point globalPosition); +/// Details for [GestureTapDownCallback], such as position. +class TapDownDetails { + /// Creates details for a [GestureTapDownCallback]. + /// + /// The [globalPosition] argument must not be null. + TapDownDetails({ this.globalPosition: Point.origin }) { + assert(globalPosition != null); + } + + /// The global position at which the pointer contacted the screen. + final Point globalPosition; +} + +/// Signature for when a pointer that might cause a tap has contacted the +/// screen. +/// +/// The position at which the pointer contacted the screen is available in the +/// `details`. +typedef void GestureTapDownCallback(TapDownDetails details); + +/// Details for [GestureTapUpCallback], such as position. +class TapUpDetails { + /// Creates details for a [GestureTapUpCallback]. + /// + /// The [globalPosition] argument must not be null. + TapUpDetails({ this.globalPosition: Point.origin }) { + assert(globalPosition != null); + } + + /// The global position at which the pointer contacted the screen. + final Point globalPosition; +} /// Signature for when a pointer that will trigger a tap has stopped contacting -/// the screen at a particular location. -typedef void GestureTapUpCallback(Point globalPosition); +/// the screen. +/// +/// The position at which the pointer stopped contacting the screen is available +/// in the `details`. +typedef void GestureTapUpCallback(TapUpDetails details); /// Signature for when a tap has occurred. typedef void GestureTapCallback(); @@ -102,7 +134,7 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { void _checkDown() { if (!_sentTapDown) { if (onTapDown != null) - onTapDown(initialPosition); + onTapDown(new TapDownDetails(globalPosition: initialPosition)); _sentTapDown = true; } } @@ -111,7 +143,7 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { if (_wonArena && _finalPosition != null) { resolve(GestureDisposition.accepted); if (onTapUp != null) - onTapUp(_finalPosition); + onTapUp(new TapUpDetails(globalPosition: _finalPosition)); if (onTap != null) onTap(); _reset(); diff --git a/packages/flutter/lib/src/material/ink_well.dart b/packages/flutter/lib/src/material/ink_well.dart index 06659a2bf2..af6ac6eb31 100644 --- a/packages/flutter/lib/src/material/ink_well.dart +++ b/packages/flutter/lib/src/material/ink_well.dart @@ -127,14 +127,14 @@ class _InkResponseState extends State { config.onHighlightChanged(value); } - void _handleTapDown(Point position) { + void _handleTapDown(TapDownDetails details) { RenderBox referenceBox = context.findRenderObject(); assert(Material.of(context) != null); InkSplash splash; RectCallback rectCallback = config.getRectCallback(referenceBox); splash = Material.of(context).splashAt( referenceBox: referenceBox, - position: referenceBox.globalToLocal(position), + position: referenceBox.globalToLocal(details.globalPosition), color: Theme.of(context).splashColor, containedInkWell: config.containedInkWell, rectCallback: config.containedInkWell ? rectCallback : null, diff --git a/packages/flutter/lib/src/material/toggleable.dart b/packages/flutter/lib/src/material/toggleable.dart index e4dc2b2ed9..bb0570467d 100644 --- a/packages/flutter/lib/src/material/toggleable.dart +++ b/packages/flutter/lib/src/material/toggleable.dart @@ -213,9 +213,9 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic } } - void _handleTapDown(Point globalPosition) { + void _handleTapDown(TapDownDetails details) { if (isInteractive) { - _downPosition = globalToLocal(globalPosition); + _downPosition = globalToLocal(details.globalPosition); _reactionController.forward(); } } @@ -225,7 +225,7 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic onChanged(!_value); } - void _handleTapUp(Point globalPosition) { + void _handleTapUp(TapUpDetails details) { _downPosition = null; if (isInteractive) _reactionController.reverse(); diff --git a/packages/flutter/lib/src/rendering/editable_line.dart b/packages/flutter/lib/src/rendering/editable_line.dart index a536df33fc..6ceb8f058f 100644 --- a/packages/flutter/lib/src/rendering/editable_line.dart +++ b/packages/flutter/lib/src/rendering/editable_line.dart @@ -217,8 +217,8 @@ class RenderEditableLine extends RenderBox { Point _lastTapDownPosition; Point _longPressPosition; - void _handleTapDown(Point globalPosition) { - _lastTapDownPosition = globalPosition + -paintOffset; + void _handleTapDown(TapDownDetails details) { + _lastTapDownPosition = details.globalPosition + -paintOffset; } void _handleTap() { diff --git a/packages/flutter/lib/src/widgets/drag_target.dart b/packages/flutter/lib/src/widgets/drag_target.dart index 5f05c51583..2e613dea02 100644 --- a/packages/flutter/lib/src/widgets/drag_target.dart +++ b/packages/flutter/lib/src/widgets/drag_target.dart @@ -416,7 +416,7 @@ class _DragAvatar extends Drag { _entry = new OverlayEntry(builder: _build); overlay.insert(_entry); _position = initialPosition; - update(initialPosition); + updateDrag(initialPosition); } final T data; @@ -433,22 +433,22 @@ class _DragAvatar extends Drag { // Drag API @override - void move(Offset offset) { - _position += offset; - update(_position); + void update(DragUpdateDetails details) { + _position += details.delta; + updateDrag(_position); } @override - void end(Velocity velocity) { - finish(_DragEndKind.dropped, velocity); + void end(DragEndDetails details) { + finishDrag(_DragEndKind.dropped, details.velocity); } @override void cancel() { - finish(_DragEndKind.canceled); + finishDrag(_DragEndKind.canceled); } - void update(Point globalPosition) { + void updateDrag(Point globalPosition) { _lastOffset = globalPosition - dragStartPoint; _entry.markNeedsBuild(); HitTestResult result = new HitTestResult(); @@ -505,7 +505,7 @@ class _DragAvatar extends Drag { _enteredTargets.clear(); } - void finish(_DragEndKind endKind, [Velocity velocity]) { + void finishDrag(_DragEndKind endKind, [Velocity velocity]) { bool wasAccepted = false; if (endKind == _DragEndKind.dropped && _activeTarget != null) { _activeTarget.didDrop(data); diff --git a/packages/flutter/lib/src/widgets/gesture_detector.dart b/packages/flutter/lib/src/widgets/gesture_detector.dart index 0123cd1fc5..a35756d746 100644 --- a/packages/flutter/lib/src/widgets/gesture_detector.dart +++ b/packages/flutter/lib/src/widgets/gesture_detector.dart @@ -26,6 +26,8 @@ export 'package:flutter/gestures.dart' show GestureScaleStartCallback, GestureScaleUpdateCallback, GestureScaleEndCallback, + TapDownDetails, + TapUpDetails, Velocity; /// Signature for creating gesture recognizers. @@ -479,9 +481,9 @@ class _GestureSemantics extends SingleChildRenderObjectWidget { TapGestureRecognizer recognizer = owner._recognizers[TapGestureRecognizer]; assert(recognizer != null); if (recognizer.onTapDown != null) - recognizer.onTapDown(Point.origin); + recognizer.onTapDown(new TapDownDetails()); if (recognizer.onTapUp != null) - recognizer.onTapUp(Point.origin); + recognizer.onTapUp(new TapUpDetails()); if (recognizer.onTap != null) recognizer.onTap(); } diff --git a/packages/flutter/lib/src/widgets/modal_barrier.dart b/packages/flutter/lib/src/widgets/modal_barrier.dart index 13a9ea33b8..30ba56a66a 100644 --- a/packages/flutter/lib/src/widgets/modal_barrier.dart +++ b/packages/flutter/lib/src/widgets/modal_barrier.dart @@ -28,7 +28,7 @@ class ModalBarrier extends StatelessWidget { return new Semantics( container: true, child: new GestureDetector( - onTapDown: (Point position) { + onTapDown: (TapDownDetails details) { if (dismissable) Navigator.pop(context); },