Commit e0107b05 authored by Ian Hickson's avatar Ian Hickson

Merge pull request #756 from Hixie/PointerInputEvent.kind

PointerInput refactor
parents bc1b47e9 f1625556
...@@ -84,8 +84,8 @@ class MineDiggerState extends State<MineDigger> { ...@@ -84,8 +84,8 @@ class MineDiggerState extends State<MineDigger> {
} }
} }
PointerEventListener _pointerDownHandlerFor(int posX, int posY) { PointerDownEventListener _pointerDownHandlerFor(int posX, int posY) {
return (PointerInputEvent event) { return (PointerDownEvent event) {
if (event.buttons == 1) { if (event.buttons == 1) {
probe(posX, posY); probe(posX, posY);
} else if (event.buttons == 2) { } else if (event.buttons == 2) {
...@@ -190,7 +190,7 @@ class MineDiggerState extends State<MineDigger> { ...@@ -190,7 +190,7 @@ class MineDiggerState extends State<MineDigger> {
); );
} }
void handleToolbarPointerDown(PointerInputEvent event) { void handleToolbarPointerDown(PointerDownEvent event) {
setState(() { setState(() {
resetGame(); resetGame();
}); });
......
...@@ -518,10 +518,11 @@ class RenderSolidColor extends RenderDecoratedSector { ...@@ -518,10 +518,11 @@ class RenderSolidColor extends RenderDecoratedSector {
deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta); deltaTheta = constraints.constrainDeltaTheta(desiredDeltaTheta);
} }
void handleEvent(InputEvent event, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
if (event.type == 'pointerdown') if (event is PointerDownEvent) {
decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000));
else if (event.type == 'pointerup') } else if (event is PointerUpEvent) {
decoration = new BoxDecoration(backgroundColor: backgroundColor); decoration = new BoxDecoration(backgroundColor: backgroundColor);
}
} }
} }
...@@ -41,10 +41,11 @@ class RenderSolidColorBox extends RenderDecoratedBox { ...@@ -41,10 +41,11 @@ class RenderSolidColorBox extends RenderDecoratedBox {
size = constraints.constrain(desiredSize); size = constraints.constrain(desiredSize);
} }
void handleEvent(InputEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event.type == 'pointerdown') if (event is PointerDownEvent) {
decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000)); decoration = new BoxDecoration(backgroundColor: const Color(0xFFFF0000));
else if (event.type == 'pointerup') } else if (event is PointerUpEvent) {
decoration = new BoxDecoration(backgroundColor: backgroundColor); decoration = new BoxDecoration(backgroundColor: backgroundColor);
}
} }
} }
...@@ -23,8 +23,8 @@ class Dot { ...@@ -23,8 +23,8 @@ class Dot {
Dot({ Color color }) : _paint = new Paint()..color = color; Dot({ Color color }) : _paint = new Paint()..color = color;
void update(PointerInputEvent event) { void update(PointerEvent event) {
position = new Point(event.x, event.y); position = event.position;
radius = 5 + (95 * event.pressure); radius = 5 + (95 * event.pressure);
} }
...@@ -36,25 +36,20 @@ class Dot { ...@@ -36,25 +36,20 @@ class Dot {
class RenderTouchDemo extends RenderBox { class RenderTouchDemo extends RenderBox {
final Map<int, Dot> dots = <int, Dot>{}; final Map<int, Dot> dots = <int, Dot>{};
void handleEvent(InputEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event is PointerInputEvent) { if (event is PointerDownEvent) {
switch (event.type) { Color color = kColors[event.pointer.remainder(kColors.length)];
case 'pointerdown': dots[event.pointer] = new Dot(color: color)..update(event);
Color color = kColors[event.pointer.remainder(kColors.length)]; } else if (event is PointerUpEvent) {
dots[event.pointer] = new Dot(color: color)..update(event); dots.remove(event.pointer);
break; } else if (event is PointerCancelEvent) {
case 'pointerup': dots.clear();
dots.remove(event.pointer); } else if (event is PointerMoveEvent) {
break; dots[event.pointer].update(event);
case 'pointercancel': } else {
dots.clear(); return;
break;
case 'pointermove':
dots[event.pointer].update(event);
break;
}
markNeedsPaint();
} }
markNeedsPaint();
} }
void performLayout() { void performLayout() {
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
import 'dart:ui' as ui; import 'dart:ui' as ui;
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
...@@ -121,9 +122,9 @@ class OverlayGeometryAppState extends State<OverlayGeometryApp> { ...@@ -121,9 +122,9 @@ class OverlayGeometryAppState extends State<OverlayGeometryApp> {
}); });
} }
void handlePointerDown(GlobalKey target, PointerInputEvent event) { void handlePointerDown(GlobalKey target, PointerDownEvent event) {
setState(() { setState(() {
markers[MarkerType.touch] = new Point(event.x, event.y); markers[MarkerType.touch] = event.position;
final RenderBox box = target.currentContext.findRenderObject(); final RenderBox box = target.currentContext.findRenderObject();
markers[MarkerType.topLeft] = box.localToGlobal(new Point(0.0, 0.0)); markers[MarkerType.topLeft] = box.localToGlobal(new Point(0.0, 0.0));
final Size size = box.size; final Size size = box.size;
...@@ -139,7 +140,7 @@ class OverlayGeometryAppState extends State<OverlayGeometryApp> { ...@@ -139,7 +140,7 @@ class OverlayGeometryAppState extends State<OverlayGeometryApp> {
CardModel cardModel = cardModels[index]; CardModel cardModel = cardModels[index];
return new Listener( return new Listener(
key: cardModel.key, key: cardModel.key,
onPointerDown: (PointerInputEvent e) { return handlePointerDown(cardModel.targetKey, e); }, onPointerDown: (PointerDownEvent event) { return handlePointerDown(cardModel.targetKey, event); },
child: new Card( child: new Card(
key: cardModel.targetKey, key: cardModel.targetKey,
color: cardModel.color, color: cardModel.color,
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui' as ui;
import 'arena.dart'; import 'arena.dart';
import 'recognizer.dart'; import 'recognizer.dart';
import 'constants.dart'; import 'constants.dart';
...@@ -16,21 +14,22 @@ enum DragState { ...@@ -16,21 +14,22 @@ enum DragState {
accepted accepted
} }
typedef void GestureDragStartCallback(ui.Point globalPosition); typedef void GestureDragStartCallback(Point globalPosition);
typedef void GestureDragUpdateCallback(double delta); typedef void GestureDragUpdateCallback(double delta);
typedef void GestureDragEndCallback(ui.Offset velocity); typedef void GestureDragEndCallback(Offset velocity);
typedef void GesturePanStartCallback(ui.Point globalPosition); typedef void GesturePanStartCallback(Point globalPosition);
typedef void GesturePanUpdateCallback(ui.Offset delta); typedef void GesturePanUpdateCallback(Offset delta);
typedef void GesturePanEndCallback(ui.Offset velocity); typedef void GesturePanEndCallback(Offset velocity);
typedef void _GesturePolymorphicUpdateCallback<T>(T delta); typedef void _GesturePolymorphicUpdateCallback<T>(T delta);
bool _isFlingGesture(GestureVelocity velocity) { bool _isFlingGesture(Offset velocity) {
double velocitySquared = velocity.x * velocity.x + velocity.y * velocity.y; if (velocity == null)
return velocity.isValid && return false;
velocitySquared > kMinFlingVelocity * kMinFlingVelocity && double velocitySquared = velocity.dx * velocity.dx + velocity.dy * velocity.dy;
velocitySquared < kMaxFlingVelocity * kMaxFlingVelocity; return velocitySquared > kMinFlingVelocity * kMinFlingVelocity
&& velocitySquared < kMaxFlingVelocity * kMaxFlingVelocity;
} }
abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGestureRecognizer { abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGestureRecognizer {
...@@ -42,16 +41,16 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest ...@@ -42,16 +41,16 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
GestureDragEndCallback onEnd; GestureDragEndCallback onEnd;
DragState _state = DragState.ready; DragState _state = DragState.ready;
ui.Point _initialPosition; Point _initialPosition;
T _pendingDragDelta; T _pendingDragDelta;
T get _initialPendingDragDelta; T get _initialPendingDragDelta;
T _getDragDelta(PointerInputEvent event); T _getDragDelta(PointerEvent event);
bool get _hasSufficientPendingDragDeltaToAccept; bool get _hasSufficientPendingDragDeltaToAccept;
Map<int, VelocityTracker> _velocityTrackers = new Map<int, VelocityTracker>(); Map<int, VelocityTracker> _velocityTrackers = new Map<int, VelocityTracker>();
void addPointer(PointerInputEvent event) { void addPointer(PointerEvent event) {
startTrackingPointer(event.pointer); startTrackingPointer(event.pointer);
_velocityTrackers[event.pointer] = new VelocityTracker(); _velocityTrackers[event.pointer] = new VelocityTracker();
if (_state == DragState.ready) { if (_state == DragState.ready) {
...@@ -61,12 +60,12 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest ...@@ -61,12 +60,12 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
} }
} }
void handleEvent(PointerInputEvent event) { void handleEvent(PointerEvent event) {
assert(_state != DragState.ready); assert(_state != DragState.ready);
if (event.type == 'pointermove') { if (event is PointerMoveEvent) {
VelocityTracker tracker = _velocityTrackers[event.pointer]; VelocityTracker tracker = _velocityTrackers[event.pointer];
assert(tracker != null); assert(tracker != null);
tracker.addPosition(event.timeStamp, event.x, event.y); tracker.addPosition(event.timeStamp, event.position);
T delta = _getDragDelta(event); T delta = _getDragDelta(event);
if (_state == DragState.accepted) { if (_state == DragState.accepted) {
if (onUpdate != null) if (onUpdate != null)
...@@ -104,11 +103,10 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest ...@@ -104,11 +103,10 @@ abstract class _DragGestureRecognizer<T extends dynamic> extends OneSequenceGest
VelocityTracker tracker = _velocityTrackers[pointer]; VelocityTracker tracker = _velocityTrackers[pointer];
assert(tracker != null); assert(tracker != null);
GestureVelocity gestureVelocity = tracker.getVelocity(); Offset velocity = tracker.getVelocity();
ui.Offset velocity = ui.Offset.zero; if (velocity != null && _isFlingGesture(velocity))
if (_isFlingGesture(gestureVelocity)) onEnd(velocity);
velocity = new ui.Offset(gestureVelocity.x, gestureVelocity.y); onEnd(Offset.zero);
onEnd(velocity);
} }
_velocityTrackers.clear(); _velocityTrackers.clear();
} }
...@@ -128,7 +126,7 @@ class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> { ...@@ -128,7 +126,7 @@ class VerticalDragGestureRecognizer extends _DragGestureRecognizer<double> {
}) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd); }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
double get _initialPendingDragDelta => 0.0; double get _initialPendingDragDelta => 0.0;
double _getDragDelta(PointerInputEvent event) => event.dy; double _getDragDelta(PointerEvent event) => event.delta.dy;
bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop;
} }
...@@ -141,11 +139,11 @@ class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> { ...@@ -141,11 +139,11 @@ class HorizontalDragGestureRecognizer extends _DragGestureRecognizer<double> {
}) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd); }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
double get _initialPendingDragDelta => 0.0; double get _initialPendingDragDelta => 0.0;
double _getDragDelta(PointerInputEvent event) => event.dx; double _getDragDelta(PointerEvent event) => event.delta.dx;
bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop; bool get _hasSufficientPendingDragDeltaToAccept => _pendingDragDelta.abs() > kTouchSlop;
} }
class PanGestureRecognizer extends _DragGestureRecognizer<ui.Offset> { class PanGestureRecognizer extends _DragGestureRecognizer<Offset> {
PanGestureRecognizer({ PanGestureRecognizer({
PointerRouter router, PointerRouter router,
GesturePanStartCallback onStart, GesturePanStartCallback onStart,
...@@ -153,8 +151,8 @@ class PanGestureRecognizer extends _DragGestureRecognizer<ui.Offset> { ...@@ -153,8 +151,8 @@ class PanGestureRecognizer extends _DragGestureRecognizer<ui.Offset> {
GesturePanEndCallback onEnd GesturePanEndCallback onEnd
}) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd); }) : super(router: router, onStart: onStart, onUpdate: onUpdate, onEnd: onEnd);
ui.Offset get _initialPendingDragDelta => ui.Offset.zero; Offset get _initialPendingDragDelta => Offset.zero;
ui.Offset _getDragDelta(PointerInputEvent event) => new ui.Offset(event.dx, event.dy); Offset _getDragDelta(PointerEvent event) => event.delta;
bool get _hasSufficientPendingDragDeltaToAccept { bool get _hasSufficientPendingDragDeltaToAccept {
return _pendingDragDelta.distance > kPanSlop; return _pendingDragDelta.distance > kPanSlop;
} }
......
...@@ -2,38 +2,37 @@ ...@@ -2,38 +2,37 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui' as ui; import 'dart:ui' show Point, Offset;
export 'dart:ui' show Point; export 'dart:ui' show Point, Offset;
/// Base class for input events. enum PointerDeviceKind { touch, stylus, invertedStylus, mouse }
class InputEvent {
const InputEvent({ this.type, this.timeStamp: const Duration() });
final String type;
final Duration timeStamp;
}
/// Input event representing a touch or button. const int primaryMouseButton = 0x01;
class PointerInputEvent extends InputEvent { const int secondaryMouseButton = 0x02;
const int primaryStylusButton = 0x02;
const int middleMouseButton = 0x04;
const int secondaryStylusButton = 0x04;
const int backMouseButton = 0x08;
const int forwardMouseButton = 0x10;
int nthMouseButton(int number) => primaryMouseButton << (number - 1);
int nthStylusButton(int number) => primaryStylusButton << (number - 1);
const PointerInputEvent({ /// Base class for touch, stylus, or mouse events.
String type, abstract class PointerEvent {
Duration timeStamp: const Duration(), const PointerEvent({
this.timeStamp: Duration.ZERO,
this.pointer: 0, this.pointer: 0,
this.kind, this.kind: PointerDeviceKind.touch,
this.x: 0.0, this.position: Point.origin,
this.y: 0.0, this.delta: Offset.zero,
this.dx: 0.0,
this.dy: 0.0,
this.buttons: 0, this.buttons: 0,
this.down: false, this.down: false,
this.primary: false,
this.obscured: false, this.obscured: false,
this.pressure: 0.0, this.pressure: 1.0,
this.pressureMin: 0.0, this.pressureMin: 1.0,
this.pressureMax: 0.0, this.pressureMax: 1.0,
this.distance: 0.0, this.distance: 0.0,
this.distanceMin: 0.0,
this.distanceMax: 0.0, this.distanceMax: 0.0,
this.radiusMajor: 0.0, this.radiusMajor: 0.0,
this.radiusMinor: 0.0, this.radiusMinor: 0.0,
...@@ -41,58 +40,357 @@ class PointerInputEvent extends InputEvent { ...@@ -41,58 +40,357 @@ class PointerInputEvent extends InputEvent {
this.radiusMax: 0.0, this.radiusMax: 0.0,
this.orientation: 0.0, this.orientation: 0.0,
this.tilt: 0.0 this.tilt: 0.0
}) : super(type: type, timeStamp: timeStamp); });
/// Time of event dispatch, relative to an arbitrary timeline.
final Duration timeStamp;
/// Unique identifier for the pointer, not reused.
final int pointer; final int pointer;
final String kind;
final double x; /// The kind of input device for which the event was generated.
final double y; final PointerDeviceKind kind;
final double dx;
final double dy; /// Coordinate of the position of the pointer, in logical pixels in the global
/// coordinate space.
final Point position;
/// Distance in logical pixels that the pointer moved since the last
/// PointerMoveEvent. Always 0.0 for down, up, and cancel events.
final Offset delta;
/// Bit field using the *Button constants (primaryMouseButton,
/// secondaryStylusButton, etc). For example, if this has the value 6 and the
/// [kind] is [PointerDeviceKind.invertedStylus], then this indicates an
/// upside-down stylus with both its primary and secondary buttons pressed.
final int buttons; final int buttons;
// Set if the pointer is currently down. For touch and stylus pointers, this
// means the object (finger, pen) is in contact with the input surface. For
// mice, it means a button is pressed.
final bool down; final bool down;
final bool primary;
// Set if an application from a different security domain is in any way
// obscuring this application's window. (Aspirational; not currently
// implemented.)
final bool obscured; final bool obscured;
/// The pressure of the touch as a number ranging from 0.0, indicating a touch
/// with no discernible pressure, to 1.0, indicating a touch with "normal"
/// pressure, and possibly beyond, indicating a stronger touch. For devices
/// that do not detect pressure (e.g. mice), returns 1.0.
final double pressure; final double pressure;
/// The minimum value that [pressure] can return for this pointer. For devices
/// that do not detect pressure (e.g. mice), returns 1.0. This will always be
/// a number less than or equal to 1.0.
final double pressureMin; final double pressureMin;
/// The maximum value that [pressure] can return for this pointer. For devices
/// that do not detect pressure (e.g. mice), returns 1.0. This will always be
/// a greater than or equal to 1.0.
final double pressureMax; final double pressureMax;
/// The distance of the detected object from the input surface (e.g. the
/// distance of a stylus or finger from a touch screen), in arbitrary units on
/// an arbitrary (not necessarily linear) scale. If the pointer is down, this
/// is 0.0 by definition.
final double distance; final double distance;
final double distanceMin;
/// The minimum value that a distance can return for this pointer (always 0.0).
final double distanceMin = 0.0;
/// The maximum value that a distance can return for this pointer. If this
/// input device cannot detect "hover touch" input events, then this will be
/// 0.0.
final double distanceMax; final double distanceMax;
/// The radius of the contact ellipse along the major axis, in logical pixels.
final double radiusMajor; final double radiusMajor;
/// The radius of the contact ellipse along the minor axis, in logical pixels.
final double radiusMinor; final double radiusMinor;
/// The minimum value that could be reported for radiusMajor and radiusMinor
/// for this pointer, in logical pixels.
final double radiusMin; final double radiusMin;
/// The minimum value that could be reported for radiusMajor and radiusMinor
/// for this pointer, in logical pixels.
final double radiusMax; final double radiusMax;
/// For PointerDeviceKind.touch events:
///
/// The angle of the contact ellipse, in radius in the range:
///
/// -pi/2 < orientation <= pi/2
///
/// ...giving the angle of the major axis of the ellipse with the y-axis
/// (negative angles indicating an orientation along the top-left /
/// bottom-right diagonal, positive angles indicating an orientation along the
/// top-right / bottom-left diagonal, and zero indicating an orientation
/// parallel with the y-axis).
///
/// For PointerDeviceKind.stylus and PointerDeviceKind.invertedStylus events:
///
/// The angle of the stylus, in radians in the range:
///
/// -pi < orientation <= pi
///
/// ...giving the angle of the axis of the stylus projected onto the input
/// surface, relative to the positive y-axis of that surface (thus 0.0
/// indicates the stylus, if projected onto that surface, would go from the
/// contact point vertically up in the positive y-axis direction, pi would
/// indicate that the stylus would go down in the negative y-axis direction;
/// pi/4 would indicate that the stylus goes up and to the right, -pi/2 would
/// indicate that the stylus goes to the left, etc).
final double orientation; final double orientation;
final double tilt;
ui.Point get position => new ui.Point(x, y); /// For PointerDeviceKind.stylus and PointerDeviceKind.invertedStylus events:
///
/// The angle of the stylus, in radians in the range:
///
/// 0 <= tilt <= pi/2
///
/// ...giving the angle of the axis of the stylus, relative to the axis
/// perpendicular to the input surface (thus 0.0 indicates the stylus is
/// orthogonal to the plane of the input surface, while pi/2 indicates that
/// the stylus is flat on that surface).
final double tilt;
String toString() => 'PointerInputEvent(x: $x, y:$y)'; String toString() => '$runtimeType($position)';
String toStringFull() { String toStringFull() {
return "PointerInputEvent(" + return '$runtimeType('
"pointer: $pointer, " + 'timeStamp: $timeStamp, '
"kind: $kind, " + 'pointer: $pointer, '
"x: $x, " + 'kind: $kind, '
"y: $y, " + 'position: $position, '
"dx: $dx, " + 'delta: $delta, '
"dy: $dy, " + 'buttons: $buttons, '
"buttons: $buttons, " + 'down: $down, '
"down: $down, " + 'obscured: $obscured, '
"primary: $primary, " + 'pressure: $pressure, '
"obscured: $obscured, " + 'pressureMin: $pressureMin, '
"pressure: $pressure, " + 'pressureMax: $pressureMax, '
"pressureMin: $pressureMin, " + 'distance: $distance, '
"pressureMax: $pressureMax, " + 'distanceMin: $distanceMin, '
"distance: $distance, " + 'distanceMax: $distanceMax, '
"distanceMin: $distanceMin, " + 'radiusMajor: $radiusMajor, '
"distanceMax: $distanceMax, " + 'radiusMinor: $radiusMinor, '
"radiusMajor: $radiusMajor, " + 'radiusMin: $radiusMin, '
"radiusMinor: $radiusMinor, " + 'radiusMax: $radiusMax, '
"radiusMin: $radiusMin, " + 'orientation: $orientation, '
"radiusMax: $radiusMax, " + 'tilt: $tilt'
"orientation: $orientation, " + ')';
"tilt: $tilt)";
} }
} }
class PointerAddedEvent extends PointerEvent {
const PointerAddedEvent({
Duration timeStamp: Duration.ZERO,
int pointer: 0,
PointerDeviceKind kind: PointerDeviceKind.touch,
Point position: Point.origin,
bool obscured: false,
double pressureMin: 0.0,
double pressureMax: 0.0,
double distance: 0.0,
double distanceMax: 0.0,
double radiusMin: 0.0,
double radiusMax: 0.0,
double orientation: 0.0,
double tilt: 0.0
}) : super(
timeStamp: timeStamp,
pointer: pointer,
kind: kind,
position: position,
obscured: obscured,
pressureMin: pressureMin,
pressureMax: pressureMax,
distance: distance,
distanceMax: distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,
tilt: tilt
);
}
class PointerRemovedEvent extends PointerEvent {
const PointerRemovedEvent({
Duration timeStamp: Duration.ZERO,
int pointer: 0,
PointerDeviceKind kind: PointerDeviceKind.touch,
bool obscured: false,
double pressureMin: 0.0,
double pressureMax: 0.0,
double distanceMax: 0.0,
double radiusMin: 0.0,
double radiusMax: 0.0
}) : super(
timeStamp: timeStamp,
pointer: pointer,
kind: kind,
position: null,
obscured: obscured,
pressureMin: pressureMin,
pressureMax: pressureMax,
distanceMax: distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax
);
}
class PointerDownEvent extends PointerEvent {
const PointerDownEvent({
Duration timeStamp: Duration.ZERO,
int pointer: 0,
PointerDeviceKind kind: PointerDeviceKind.touch,
Point position: Point.origin,
int buttons: 0,
bool obscured: false,
double pressure: 0.0,
double pressureMin: 0.0,
double pressureMax: 0.0,
double distanceMax: 0.0,
double radiusMajor: 0.0,
double radiusMinor: 0.0,
double radiusMin: 0.0,
double radiusMax: 0.0,
double orientation: 0.0,
double tilt: 0.0
}) : super(
timeStamp: timeStamp,
pointer: pointer,
kind: kind,
position: position,
buttons: buttons,
down: true,
obscured: obscured,
pressure: pressure,
pressureMin: pressureMin,
pressureMax: pressureMax,
distance: 0.0,
distanceMax: distanceMax,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,
tilt: tilt
);
}
class PointerMoveEvent extends PointerEvent {
const PointerMoveEvent({
Duration timeStamp: Duration.ZERO,
int pointer: 0,
PointerDeviceKind kind: PointerDeviceKind.touch,
Point position: Point.origin,
Offset delta: Offset.zero,
int buttons: 0,
bool down: false,
bool obscured: false,
double pressure: 0.0,
double pressureMin: 0.0,
double pressureMax: 0.0,
double distance: 0.0,
double distanceMax: 0.0,
double radiusMajor: 0.0,
double radiusMinor: 0.0,
double radiusMin: 0.0,
double radiusMax: 0.0,
double orientation: 0.0,
double tilt: 0.0
}) : super(
timeStamp: timeStamp,
pointer: pointer,
kind: kind,
position: position,
delta: delta,
buttons: buttons,
down: down,
obscured: obscured,
pressure: pressure,
pressureMin: pressureMin,
pressureMax: pressureMax,
distance: distance,
distanceMax: distanceMax,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,
tilt: tilt
);
}
class PointerUpEvent extends PointerEvent {
const PointerUpEvent({
Duration timeStamp: Duration.ZERO,
int pointer: 0,
PointerDeviceKind kind: PointerDeviceKind.touch,
Point position: Point.origin,
int buttons: 0,
bool obscured: false,
double pressureMin: 0.0,
double pressureMax: 0.0,
double distance: 0.0,
double distanceMax: 0.0,
double radiusMin: 0.0,
double radiusMax: 0.0,
double orientation: 0.0,
double tilt: 0.0
}) : super(
timeStamp: timeStamp,
pointer: pointer,
kind: kind,
position: position,
buttons: buttons,
obscured: obscured,
pressureMin: pressureMin,
pressureMax: pressureMax,
distance: distance,
distanceMax: distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,
tilt: tilt
);
}
class PointerCancelEvent extends PointerEvent {
const PointerCancelEvent({
Duration timeStamp: Duration.ZERO,
int pointer: 0,
PointerDeviceKind kind: PointerDeviceKind.touch,
Point position: Point.origin,
int buttons: 0,
bool obscured: false,
double pressureMin: 0.0,
double pressureMax: 0.0,
double distance: 0.0,
double distanceMax: 0.0,
double radiusMin: 0.0,
double radiusMax: 0.0,
double orientation: 0.0,
double tilt: 0.0
}) : super(
timeStamp: timeStamp,
pointer: pointer,
kind: kind,
position: position,
buttons: buttons,
obscured: obscured,
pressureMin: pressureMin,
pressureMax: pressureMax,
distance: distance,
distanceMax: distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: orientation,
tilt: tilt
);
}
...@@ -18,11 +18,12 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer { ...@@ -18,11 +18,12 @@ class LongPressGestureRecognizer extends PrimaryPointerGestureRecognizer {
void didExceedDeadline() { void didExceedDeadline() {
resolve(GestureDisposition.accepted); resolve(GestureDisposition.accepted);
onLongPress(); if (onLongPress != null)
onLongPress();
} }
void handlePrimaryPointer(PointerInputEvent event) { void handlePrimaryPointer(PointerEvent event) {
if (event.type == 'pointerup') if (event is PointerUpEvent)
resolve(GestureDisposition.rejected); resolve(GestureDisposition.rejected);
} }
} }
...@@ -15,16 +15,22 @@ class _Vector { ...@@ -15,16 +15,22 @@ class _Vector {
_Vector.fromVOL(List<double> values, int offset, int length) _Vector.fromVOL(List<double> values, int offset, int length)
: _offset = offset, _length = length, _elements = values; : _offset = offset, _length = length, _elements = values;
final int _offset;
int get length => _length; int get length => _length;
final int _length;
final List<double> _elements;
operator [](int i) => _elements[i + _offset]; double operator [](int i) => _elements[i + _offset];
operator []=(int i, double value) => _elements[i + _offset] = value; void operator []=(int i, double value) {
_elements[i + _offset] = value;
}
operator *(_Vector a) { double operator *(_Vector a) {
double result = 0.0; double result = 0.0;
for (int i = 0; i < _length; i++) { for (int i = 0; i < _length; i += 1)
result += this[i] * a[i]; result += this[i] * a[i];
}
return result; return result;
} }
...@@ -39,10 +45,6 @@ class _Vector { ...@@ -39,10 +45,6 @@ class _Vector {
} }
return result; return result;
} }
final int _offset;
final int _length;
final List<double> _elements;
} }
class _Matrix { class _Matrix {
...@@ -51,6 +53,10 @@ class _Matrix { ...@@ -51,6 +53,10 @@ class _Matrix {
_columns = cols, _columns = cols,
_elements = new Float64List(rows * cols); _elements = new Float64List(rows * cols);
final int _rows;
final int _columns;
final List<double> _elements;
double get(int row, int col) => _elements[row * _columns + col]; double get(int row, int col) => _elements[row * _columns + col];
void set(int row, int col, double value) { void set(int row, int col, double value) {
_elements[row * _columns + col] = value; _elements[row * _columns + col] = value;
...@@ -75,10 +81,6 @@ class _Matrix { ...@@ -75,10 +81,6 @@ class _Matrix {
} }
return result; return result;
} }
final int _rows;
final int _columns;
final List<double> _elements;
} }
class PolynomialFit { class PolynomialFit {
...@@ -110,11 +112,10 @@ class LeastSquaresSolver { ...@@ -110,11 +112,10 @@ class LeastSquaresSolver {
// Expand the X vector to a matrix A, pre-multiplied by the weights. // Expand the X vector to a matrix A, pre-multiplied by the weights.
_Matrix a = new _Matrix(n, m); _Matrix a = new _Matrix(n, m);
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1) {
a.set(0, h, w[h]); a.set(0, h, w[h]);
for (int i = 1; i < n; i++) { for (int i = 1; i < n; i += 1)
a.set(i, h, a.get(i - 1, h) * x[h]); a.set(i, h, a.get(i - 1, h) * x[h]);
}
} }
// Apply the Gram-Schmidt process to A to obtain its QR decomposition. // Apply the Gram-Schmidt process to A to obtain its QR decomposition.
...@@ -123,15 +124,13 @@ class LeastSquaresSolver { ...@@ -123,15 +124,13 @@ class LeastSquaresSolver {
_Matrix q = new _Matrix(n, m); _Matrix q = new _Matrix(n, m);
// Upper triangular matrix, row-major order. // Upper triangular matrix, row-major order.
_Matrix r = new _Matrix(n, n); _Matrix r = new _Matrix(n, n);
for (int j = 0; j < n; j++) { for (int j = 0; j < n; j += 1) {
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1)
q.set(j, h, a.get(j, h)); q.set(j, h, a.get(j, h));
} for (int i = 0; i < j; i += 1) {
for (int i = 0; i < j; i++) {
double dot = q.getRow(j) * q.getRow(i); double dot = q.getRow(j) * q.getRow(i);
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1)
q.set(j, h, q.get(j, h) - dot * q.get(i, h)); q.set(j, h, q.get(j, h) - dot * q.get(i, h));
}
} }
double norm = q.getRow(j).norm(); double norm = q.getRow(j).norm();
...@@ -141,56 +140,50 @@ class LeastSquaresSolver { ...@@ -141,56 +140,50 @@ class LeastSquaresSolver {
} }
double inverseNorm = 1.0 / norm; double inverseNorm = 1.0 / norm;
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1)
q.set(j, h, q.get(j, h) * inverseNorm); q.set(j, h, q.get(j, h) * inverseNorm);
} for (int i = 0; i < n; i += 1)
for (int i = 0; i < n; i++) {
r.set(j, i, i < j ? 0.0 : q.getRow(j) * a.getRow(i)); r.set(j, i, i < j ? 0.0 : q.getRow(j) * a.getRow(i));
}
} }
// Solve R B = Qt W Y to find B. This is easy because R is upper triangular. // Solve R B = Qt W Y to find B. This is easy because R is upper triangular.
// We just work from bottom-right to top-left calculating B's coefficients. // We just work from bottom-right to top-left calculating B's coefficients.
_Vector wy = new _Vector(m); _Vector wy = new _Vector(m);
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1)
wy[h] = y[h] * w[h]; wy[h] = y[h] * w[h];
} for (int i = n - 1; i >= 0; i -= 1) {
for (int i = n; i-- != 0;) {
result.coefficients[i] = q.getRow(i) * wy; result.coefficients[i] = q.getRow(i) * wy;
for (int j = n - 1; j > i; j--) { for (int j = n - 1; j > i; j -= 1)
result.coefficients[i] -= r.get(i, j) * result.coefficients[j]; result.coefficients[i] -= r.get(i, j) * result.coefficients[j];
}
result.coefficients[i] /= r.get(i, i); result.coefficients[i] /= r.get(i, i);
} }
// Calculate the coefficient of determination (confidence) as: // Calculate the coefficient of determination (confidence) as:
// 1 - (sumSquaredError / sumSquaredTotal) // 1 - (sumSquaredError / sumSquaredTotal)
// where sumSquaredError is the residual sum of squares (variance of the // ...where sumSquaredError is the residual sum of squares (variance of the
// error), and sumSquaredTotal is the total sum of squares (variance of the // error), and sumSquaredTotal is the total sum of squares (variance of the
// data) where each has been weighted. // data) where each has been weighted.
double yMean = 0.0; double yMean = 0.0;
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1)
yMean += y[h]; yMean += y[h];
}
yMean /= m; yMean /= m;
double sumSquaredError = 0.0; double sumSquaredError = 0.0;
double sumSquaredTotal = 0.0; double sumSquaredTotal = 0.0;
for (int h = 0; h < m; h++) { for (int h = 0; h < m; h += 1) {
double err = y[h] - result.coefficients[0];
double term = 1.0; double term = 1.0;
for (int i = 1; i < n; i++) { double err = y[h] - result.coefficients[0];
for (int i = 1; i < n; i += 1) {
term *= x[h]; term *= x[h];
err -= term * result.coefficients[i]; err -= term * result.coefficients[i];
} }
sumSquaredError += w[h] * w[h] * err * err; sumSquaredError += w[h] * w[h] * err * err;
double v = y[h] - yMean; final double v = y[h] - yMean;
sumSquaredTotal += w[h] * w[h] * v * v; sumSquaredTotal += w[h] * w[h] * v * v;
} }
result.confidence = sumSquaredTotal > 0.000001 ? result.confidence = sumSquaredTotal <= 0.000001 ? 1.0 :
1.0 - (sumSquaredError / sumSquaredTotal) : 1.0 - (sumSquaredError / sumSquaredTotal);
1.0;
return result; return result;
} }
......
...@@ -22,11 +22,9 @@ typedef void GestureMultiTapCancelCallback(int pointer); ...@@ -22,11 +22,9 @@ typedef void GestureMultiTapCancelCallback(int pointer);
/// larger gesture. /// larger gesture.
class _TapTracker { class _TapTracker {
_TapTracker({ PointerInputEvent event, this.entry }) _TapTracker({ PointerDownEvent event, this.entry })
: pointer = event.pointer, : pointer = event.pointer,
_initialPosition = event.position { _initialPosition = event.position;
assert(event.type == 'pointerdown');
}
final int pointer; final int pointer;
final GestureArenaEntry entry; final GestureArenaEntry entry;
...@@ -48,7 +46,7 @@ class _TapTracker { ...@@ -48,7 +46,7 @@ class _TapTracker {
} }
} }
bool isWithinTolerance(PointerInputEvent event, double tolerance) { bool isWithinTolerance(PointerEvent event, double tolerance) {
Offset offset = event.position - _initialPosition; Offset offset = event.position - _initialPosition;
return offset.distance <= tolerance; return offset.distance <= tolerance;
} }
...@@ -92,7 +90,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -92,7 +90,7 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
_TapTracker _firstTap; _TapTracker _firstTap;
final Map<int, _TapTracker> _trackers = new Map<int, _TapTracker>(); final Map<int, _TapTracker> _trackers = new Map<int, _TapTracker>();
void addPointer(PointerInputEvent event) { void addPointer(PointerEvent event) {
// Ignore out-of-bounds second taps // Ignore out-of-bounds second taps
if (_firstTap != null && if (_firstTap != null &&
!_firstTap.isWithinTolerance(event, kDoubleTapSlop)) !_firstTap.isWithinTolerance(event, kDoubleTapSlop))
...@@ -106,23 +104,19 @@ class DoubleTapGestureRecognizer extends GestureRecognizer { ...@@ -106,23 +104,19 @@ class DoubleTapGestureRecognizer extends GestureRecognizer {
tracker.startTrackingPointer(_router, handleEvent); tracker.startTrackingPointer(_router, handleEvent);
} }
void handleEvent(PointerInputEvent event) { void handleEvent(PointerEvent event) {
_TapTracker tracker = _trackers[event.pointer]; _TapTracker tracker = _trackers[event.pointer];
assert(tracker != null); assert(tracker != null);
switch (event.type) { if (event is PointerUpEvent) {
case 'pointerup': if (_firstTap == null)
if (_firstTap == null) _registerFirstTap(tracker);
_registerFirstTap(tracker); else
else _registerSecondTap(tracker);
_registerSecondTap(tracker); } else if (event is PointerMoveEvent) {
break; if (!tracker.isWithinTolerance(event, kDoubleTapTouchSlop))
case 'pointermove':
if (!tracker.isWithinTolerance(event, kDoubleTapTouchSlop))
_reject(tracker);
break;
case 'pointercancel':
_reject(tracker); _reject(tracker);
break; } else if (event is PointerCancelEvent) {
_reject(tracker);
} }
} }
...@@ -228,7 +222,7 @@ class _TapGesture extends _TapTracker { ...@@ -228,7 +222,7 @@ class _TapGesture extends _TapTracker {
_TapGesture({ _TapGesture({
MultiTapGestureRecognizer gestureRecognizer, MultiTapGestureRecognizer gestureRecognizer,
PointerInputEvent event, PointerEvent event,
Duration longTapDelay Duration longTapDelay
}) : gestureRecognizer = gestureRecognizer, }) : gestureRecognizer = gestureRecognizer,
_lastPosition = event.position, _lastPosition = event.position,
...@@ -250,16 +244,16 @@ class _TapGesture extends _TapTracker { ...@@ -250,16 +244,16 @@ class _TapGesture extends _TapTracker {
Point _lastPosition; Point _lastPosition;
Point _finalPosition; Point _finalPosition;
void handleEvent(PointerInputEvent event) { void handleEvent(PointerEvent event) {
assert(event.pointer == pointer); assert(event.pointer == pointer);
if (event.type == 'pointermove') { if (event is PointerMoveEvent) {
if (!isWithinTolerance(event, kTouchSlop)) if (!isWithinTolerance(event, kTouchSlop))
cancel(); cancel();
else else
_lastPosition = event.position; _lastPosition = event.position;
} else if (event.type == 'pointercancel') { } else if (event is PointerCancelEvent) {
cancel(); cancel();
} else if (event.type == 'pointerup') { } else if (event is PointerUpEvent) {
stopTrackingPointer(gestureRecognizer.router, handleEvent); stopTrackingPointer(gestureRecognizer.router, handleEvent);
_finalPosition = event.position; _finalPosition = event.position;
_check(); _check();
...@@ -326,7 +320,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer { ...@@ -326,7 +320,7 @@ class MultiTapGestureRecognizer extends GestureRecognizer {
final Map<int, _TapGesture> _gestureMap = new Map<int, _TapGesture>(); final Map<int, _TapGesture> _gestureMap = new Map<int, _TapGesture>();
void addPointer(PointerInputEvent event) { void addPointer(PointerEvent event) {
assert(!_gestureMap.containsKey(event.pointer)); assert(!_gestureMap.containsKey(event.pointer));
_gestureMap[event.pointer] = new _TapGesture( _gestureMap[event.pointer] = new _TapGesture(
gestureRecognizer: this, gestureRecognizer: this,
......
...@@ -4,16 +4,16 @@ ...@@ -4,16 +4,16 @@
import 'events.dart'; import 'events.dart';
/// A callback that receives a [PointerInputEvent] /// A callback that receives a [PointerEvent]
typedef void PointerRoute(PointerInputEvent event); typedef void PointerRoute(PointerEvent event);
/// A routing table for [PointerInputEvent] events. /// A routing table for [PointerEvent] events.
class PointerRouter { class PointerRouter {
final Map<int, List<PointerRoute>> _routeMap = new Map<int, List<PointerRoute>>(); final Map<int, List<PointerRoute>> _routeMap = new Map<int, List<PointerRoute>>();
/// Adds a route to the routing table /// Adds a route to the routing table.
/// ///
/// Whenever this object routes a [PointerInputEvent] corresponding to /// Whenever this object routes a [PointerEvent] corresponding to
/// pointer, call route. /// pointer, call route.
void addRoute(int pointer, PointerRoute route) { void addRoute(int pointer, PointerRoute route) {
List<PointerRoute> routes = _routeMap.putIfAbsent(pointer, () => new List<PointerRoute>()); List<PointerRoute> routes = _routeMap.putIfAbsent(pointer, () => new List<PointerRoute>());
...@@ -21,9 +21,9 @@ class PointerRouter { ...@@ -21,9 +21,9 @@ class PointerRouter {
routes.add(route); routes.add(route);
} }
/// Removes a route from the routing table /// Removes a route from the routing table.
/// ///
/// No longer call route when routing a [PointerInputEvent] corresponding to /// No longer call route when routing a [PointerEvent] corresponding to
/// pointer. Requires that this route was previously added to the router. /// pointer. Requires that this route was previously added to the router.
void removeRoute(int pointer, PointerRoute route) { void removeRoute(int pointer, PointerRoute route) {
assert(_routeMap.containsKey(pointer)); assert(_routeMap.containsKey(pointer));
...@@ -37,7 +37,7 @@ class PointerRouter { ...@@ -37,7 +37,7 @@ class PointerRouter {
/// Call the routes registed for this pointer event. /// Call the routes registed for this pointer event.
/// ///
/// Calls the routes in the order in which they were added to the route. /// Calls the routes in the order in which they were added to the route.
void route(PointerInputEvent event) { void route(PointerEvent event) {
List<PointerRoute> routes = _routeMap[event.pointer]; List<PointerRoute> routes = _routeMap[event.pointer];
if (routes == null) if (routes == null)
return; return;
......
...@@ -18,7 +18,7 @@ abstract class GestureRecognizer extends GestureArenaMember { ...@@ -18,7 +18,7 @@ abstract class GestureRecognizer extends GestureArenaMember {
/// considered for this gesture. (It's the GestureRecognizer's responsibility /// considered for this gesture. (It's the GestureRecognizer's responsibility
/// to then add itself to the global pointer router to receive subsequent /// to then add itself to the global pointer router to receive subsequent
/// events for this pointer.) /// events for this pointer.)
void addPointer(PointerInputEvent event); void addPointer(PointerDownEvent event);
/// Release any resources used by the object. Called when the object is no /// Release any resources used by the object. Called when the object is no
/// longer needed (e.g. a gesture recogniser is being unregistered from a /// longer needed (e.g. a gesture recogniser is being unregistered from a
...@@ -34,10 +34,10 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer { ...@@ -34,10 +34,10 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
PointerRouter _router; PointerRouter _router;
final List<GestureArenaEntry> _entries = new List<GestureArenaEntry>(); final List<GestureArenaEntry> _entries = <GestureArenaEntry>[];
final Set<int> _trackedPointers = new Set<int>(); final Set<int> _trackedPointers = new Set<int>();
void handleEvent(PointerInputEvent event); void handleEvent(PointerEvent event);
void acceptGesture(int pointer) { } void acceptGesture(int pointer) { }
void rejectGesture(int pointer) { } void rejectGesture(int pointer) { }
void didStopTrackingLastPointer(int pointer); void didStopTrackingLastPointer(int pointer);
...@@ -71,8 +71,8 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer { ...@@ -71,8 +71,8 @@ abstract class OneSequenceGestureRecognizer extends GestureRecognizer {
didStopTrackingLastPointer(pointer); didStopTrackingLastPointer(pointer);
} }
void stopTrackingIfPointerNoLongerDown(PointerInputEvent event) { void stopTrackingIfPointerNoLongerDown(PointerEvent event) {
if (event.type == 'pointerup' || event.type == 'pointercancel') if (event is PointerUpEvent || event is PointerCancelEvent)
stopTrackingPointer(event.pointer); stopTrackingPointer(event.pointer);
} }
...@@ -95,7 +95,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni ...@@ -95,7 +95,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
Point initialPosition; Point initialPosition;
Timer _timer; Timer _timer;
void addPointer(PointerInputEvent event) { void addPointer(PointerDownEvent event) {
startTrackingPointer(event.pointer); startTrackingPointer(event.pointer);
if (state == GestureRecognizerState.ready) { if (state == GestureRecognizerState.ready) {
state = GestureRecognizerState.possible; state = GestureRecognizerState.possible;
...@@ -106,11 +106,11 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni ...@@ -106,11 +106,11 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
} }
} }
void handleEvent(PointerInputEvent event) { void handleEvent(PointerEvent event) {
assert(state != GestureRecognizerState.ready); assert(state != GestureRecognizerState.ready);
if (state == GestureRecognizerState.possible && event.pointer == primaryPointer) { if (state == GestureRecognizerState.possible && event.pointer == primaryPointer) {
// TODO(abarth): Maybe factor the slop handling out into a separate class? // TODO(abarth): Maybe factor the slop handling out into a separate class?
if (event.type == 'pointermove' && _getDistance(event) > kTouchSlop) { if (event is PointerMoveEvent && _getDistance(event) > kTouchSlop) {
resolve(GestureDisposition.rejected); resolve(GestureDisposition.rejected);
stopTrackingPointer(primaryPointer); stopTrackingPointer(primaryPointer);
} else { } else {
...@@ -121,7 +121,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni ...@@ -121,7 +121,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
} }
/// Override to provide behavior for the primary pointer when the gesture is still possible. /// Override to provide behavior for the primary pointer when the gesture is still possible.
void handlePrimaryPointer(PointerInputEvent event); void handlePrimaryPointer(PointerEvent event);
/// Override to be notified with [deadline] is exceeded. /// Override to be notified with [deadline] is exceeded.
/// ///
...@@ -154,7 +154,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni ...@@ -154,7 +154,7 @@ abstract class PrimaryPointerGestureRecognizer extends OneSequenceGestureRecogni
} }
} }
double _getDistance(PointerInputEvent event) { double _getDistance(PointerEvent event) {
Offset offset = event.position - initialPosition; Offset offset = event.position - initialPosition;
return offset.distance; return offset.distance;
} }
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui' as ui;
import 'arena.dart'; import 'arena.dart';
import 'recognizer.dart'; import 'recognizer.dart';
import 'constants.dart'; import 'constants.dart';
...@@ -16,8 +14,8 @@ enum ScaleState { ...@@ -16,8 +14,8 @@ enum ScaleState {
started started
} }
typedef void GestureScaleStartCallback(ui.Point focalPoint); typedef void GestureScaleStartCallback(Point focalPoint);
typedef void GestureScaleUpdateCallback(double scale, ui.Point focalPoint); typedef void GestureScaleUpdateCallback(double scale, Point focalPoint);
typedef void GestureScaleEndCallback(); typedef void GestureScaleEndCallback();
class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
...@@ -32,35 +30,31 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { ...@@ -32,35 +30,31 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
double _initialSpan; double _initialSpan;
double _currentSpan; double _currentSpan;
Map<int, ui.Point> _pointerLocations; Map<int, Point> _pointerLocations;
double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0; double get _scaleFactor => _initialSpan > 0.0 ? _currentSpan / _initialSpan : 1.0;
void addPointer(PointerInputEvent event) { void addPointer(PointerEvent event) {
startTrackingPointer(event.pointer); startTrackingPointer(event.pointer);
if (_state == ScaleState.ready) { if (_state == ScaleState.ready) {
_state = ScaleState.possible; _state = ScaleState.possible;
_initialSpan = 0.0; _initialSpan = 0.0;
_currentSpan = 0.0; _currentSpan = 0.0;
_pointerLocations = new Map<int, ui.Point>(); _pointerLocations = new Map<int, Point>();
} }
} }
void handleEvent(PointerInputEvent event) { void handleEvent(PointerEvent event) {
assert(_state != ScaleState.ready); assert(_state != ScaleState.ready);
bool configChanged = false; bool configChanged = false;
switch(event.type) { if (event is PointerMoveEvent) {
case 'pointerup': _pointerLocations[event.pointer] = event.position;
configChanged = true; } else if (event is PointerDownEvent) {
_pointerLocations.remove(event.pointer); configChanged = true;
break; _pointerLocations[event.pointer] = event.position;
case 'pointerdown': } else if (event is PointerUpEvent) {
configChanged = true; configChanged = true;
_pointerLocations[event.pointer] = new ui.Point(event.x, event.y); _pointerLocations.remove(event.pointer);
break;
case 'pointermove':
_pointerLocations[event.pointer] = new ui.Point(event.x, event.y);
break;
} }
_update(configChanged); _update(configChanged);
...@@ -72,10 +66,10 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer { ...@@ -72,10 +66,10 @@ class ScaleGestureRecognizer extends OneSequenceGestureRecognizer {
int count = _pointerLocations.keys.length; int count = _pointerLocations.keys.length;
// Compute the focal point // Compute the focal point
ui.Point focalPoint = ui.Point.origin; Point focalPoint = Point.origin;
for (int pointer in _pointerLocations.keys) for (int pointer in _pointerLocations.keys)
focalPoint += _pointerLocations[pointer].toOffset(); focalPoint += _pointerLocations[pointer].toOffset();
focalPoint = new ui.Point(focalPoint.x / count, focalPoint.y / count); focalPoint = new Point(focalPoint.x / count, focalPoint.y / count);
// Span is the average deviation from focal point // Span is the average deviation from focal point
double totalDeviation = 0.0; double totalDeviation = 0.0;
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui' show Point, Offset;
import 'arena.dart'; import 'arena.dart';
import 'constants.dart'; import 'constants.dart';
import 'events.dart'; import 'events.dart';
...@@ -36,8 +34,8 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer { ...@@ -36,8 +34,8 @@ class TapGestureRecognizer extends PrimaryPointerGestureRecognizer {
bool _wonArena = false; bool _wonArena = false;
Point _finalPosition; Point _finalPosition;
void handlePrimaryPointer(PointerInputEvent event) { void handlePrimaryPointer(PointerEvent event) {
if (event.type == 'pointerup') { if (event is PointerUpEvent) {
_finalPosition = event.position; _finalPosition = event.position;
_checkUp(); _checkUp();
} }
......
...@@ -2,17 +2,11 @@ ...@@ -2,17 +2,11 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui' as ui; import 'dart:ui' show Point, Offset;
import 'lsq_solver.dart'; import 'lsq_solver.dart';
class GestureVelocity { export 'dart:ui' show Point, Offset;
GestureVelocity({ this.isValid: false, this.x: 0.0, this.y : 0.0 });
final bool isValid;
final double x;
final double y;
}
class _Estimator { class _Estimator {
int degree; int degree;
...@@ -22,17 +16,16 @@ class _Estimator { ...@@ -22,17 +16,16 @@ class _Estimator {
double confidence; double confidence;
String toString() { String toString() {
String result = "Estimator(degree: " + degree.toString(); return 'Estimator(degree: $degree, '
result += ", time: " + time.toString(); 'time: $time, '
result += ", confidence: " + confidence.toString(); 'confidence: $confidence, '
result += ", xCoefficients: " + xCoefficients.toString(); 'xCoefficients: $xCoefficients, '
result += ", yCoefficients: " + yCoefficients.toString(); 'yCoefficients: $yCoefficients)';
return result;
} }
} }
abstract class _VelocityTrackerStrategy { abstract class _VelocityTrackerStrategy {
void addMovement(Duration timeStamp, double x, double y); void addMovement(Duration timeStamp, Point position);
bool getEstimator(_Estimator estimator); bool getEstimator(_Estimator estimator);
void clear(); void clear();
} }
...@@ -45,28 +38,46 @@ enum _Weighting { ...@@ -45,28 +38,46 @@ enum _Weighting {
} }
class _Movement { class _Movement {
Duration eventTime = const Duration(); Duration eventTime = Duration.ZERO;
ui.Point position = ui.Point.origin; Point position = Point.origin;
} }
typedef double _WeightChooser(int index);
class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
static const int kHistorySize = 20; static const int kHistorySize = 20;
static const int kHorizonMilliseconds = 100; static const int kHorizonMilliseconds = 100;
_LeastSquaresVelocityTrackerStrategy(this.degree, this.weighting) _LeastSquaresVelocityTrackerStrategy(this.degree, _Weighting weighting)
: _index = 0, _movements = new List<_Movement>(kHistorySize); : _index = 0, _movements = new List<_Movement>(kHistorySize) {
switch (weighting) {
case _Weighting.weightingNone:
_chooseWeight = null;
break;
case _Weighting.weightingDelta:
_chooseWeight = _weightDelta;
break;
case _Weighting.weightingCentral:
_chooseWeight = _weightCentral;
break;
case _Weighting.weightingRecent:
_chooseWeight = _weightRecent;
break;
}
}
final int degree; final int degree;
final _Weighting weighting;
final List<_Movement> _movements; final List<_Movement> _movements;
_WeightChooser _chooseWeight;
int _index; int _index;
void addMovement(Duration timeStamp, double x, double y) { void addMovement(Duration timeStamp, Point position) {
if (++_index == kHistorySize) _index += 1;
if (_index == kHistorySize)
_index = 0; _index = 0;
_Movement movement = _getMovement(_index); _Movement movement = _getMovement(_index);
movement.eventTime = timeStamp; movement.eventTime = timeStamp;
movement.position = new ui.Point(x, y); movement.position = position;
} }
bool getEstimator(_Estimator estimator) { bool getEstimator(_Estimator estimator) {
...@@ -85,16 +96,18 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { ...@@ -85,16 +96,18 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
if (age > kHorizonMilliseconds) if (age > kHorizonMilliseconds)
break; break;
ui.Point position = movement.position; Point position = movement.position;
x.add(position.x); x.add(position.x);
y.add(position.y); y.add(position.y);
w.add(_chooseWeight(index)); w.add(_chooseWeight != null ? _chooseWeight(index) : 1.0);
time.add(-age); time.add(-age);
index = (index == 0 ? kHistorySize : index) - 1; index = (index == 0 ? kHistorySize : index) - 1;
} while (++m < kHistorySize);
if (m == 0) m += 1;
return false; // no data } while (m < kHistorySize);
if (m == 0) // because we broke out of the loop above after age > kHorizonMilliseconds
return false; // no data
// Calculate a least squares polynomial fit. // Calculate a least squares polynomial fit.
int n = degree; int n = degree;
...@@ -120,8 +133,8 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { ...@@ -120,8 +133,8 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
// No velocity data available for this pointer, but we do have its current // No velocity data available for this pointer, but we do have its current
// position. // position.
estimator.xCoefficients = [ x[0] ]; estimator.xCoefficients = <double>[ x[0] ];
estimator.yCoefficients = [ y[0] ]; estimator.yCoefficients = <double>[ y[0] ];
estimator.time = newestMovement.eventTime; estimator.time = newestMovement.eventTime;
estimator.degree = 0; estimator.degree = 0;
estimator.confidence = 1.0; estimator.confidence = 1.0;
...@@ -132,71 +145,61 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy { ...@@ -132,71 +145,61 @@ class _LeastSquaresVelocityTrackerStrategy extends _VelocityTrackerStrategy {
_index = -1; _index = -1;
} }
double _chooseWeight(int index) { double _weightDelta(int index) {
switch (weighting) { // Weight points based on how much time elapsed between them and the next
case _Weighting.weightingDelta: // point so that points that "cover" a shorter time span are weighed less.
// Weight points based on how much time elapsed between them and the next // delta 0ms: 0.5
// point so that points that "cover" a shorter time span are weighed less. // delta 10ms: 1.0
// delta 0ms: 0.5 if (index == _index)
// delta 10ms: 1.0 return 1.0;
if (index == _index) { int nextIndex = (index + 1) % kHistorySize;
return 1.0; int deltaMilliseconds = (_movements[nextIndex].eventTime - _movements[index].eventTime).inMilliseconds;
} if (deltaMilliseconds < 0)
int nextIndex = (index + 1) % kHistorySize; return 0.5;
int deltaMilliseconds = (_movements[nextIndex].eventTime - _movements[index].eventTime).inMilliseconds; if (deltaMilliseconds < 10)
if (deltaMilliseconds < 0) return 0.5 + deltaMilliseconds * 0.05;
return 0.5; return 1.0;
if (deltaMilliseconds < 10) }
return 0.5 + deltaMilliseconds * 0.05;
return 1.0;
case _Weighting.weightingCentral:
// Weight points based on their age, weighing very recent and very old
// points less.
// age 0ms: 0.5
// age 10ms: 1.0
// age 50ms: 1.0
// age 60ms: 0.5
int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
if (ageMilliseconds < 0)
return 0.5;
if (ageMilliseconds < 10)
return 0.5 + ageMilliseconds * 0.05;
if (ageMilliseconds < 50)
return 1.0;
if (ageMilliseconds < 60)
return 0.5 + (60 - ageMilliseconds) * 0.05;
return 0.5;
case _Weighting.weightingRecent: double _weightCentral(int index) {
// Weight points based on their age, weighing older points less. // Weight points based on their age, weighing very recent and very old
// age 0ms: 1.0 // points less.
// age 50ms: 1.0 // age 0ms: 0.5
// age 100ms: 0.5 // age 10ms: 1.0
int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds; // age 50ms: 1.0
if (ageMilliseconds < 50) { // age 60ms: 0.5
return 1.0; int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
} if (ageMilliseconds < 0)
if (ageMilliseconds < 100) { return 0.5;
return 0.5 + (100 - ageMilliseconds) * 0.01; if (ageMilliseconds < 10)
} return 0.5 + ageMilliseconds * 0.05;
return 0.5; if (ageMilliseconds < 50)
return 1.0;
if (ageMilliseconds < 60)
return 0.5 + (60 - ageMilliseconds) * 0.05;
return 0.5;
}
case _Weighting.weightingNone: double _weightRecent(int index) {
default: // Weight points based on their age, weighing older points less.
return 1.0; // age 0ms: 1.0
} // age 50ms: 1.0
// age 100ms: 0.5
int ageMilliseconds = (_movements[_index].eventTime - _movements[index].eventTime).inMilliseconds;
if (ageMilliseconds < 50)
return 1.0;
if (ageMilliseconds < 100)
return 0.5 + (100 - ageMilliseconds) * 0.01;
return 0.5;
} }
_Movement _getMovement(int i) { _Movement _getMovement(int i) {
_Movement result = _movements[i]; _Movement result = _movements[i];
if (result == null) { if (result == null) {
result = new _Movement(); result = new _Movement();
_movements[i] = result; _movements[i] = result;
} }
return result; return result;
} }
} }
...@@ -209,24 +212,22 @@ class VelocityTracker { ...@@ -209,24 +212,22 @@ class VelocityTracker {
Duration _lastTimeStamp = const Duration(); Duration _lastTimeStamp = const Duration();
_VelocityTrackerStrategy _strategy; _VelocityTrackerStrategy _strategy;
void addPosition(Duration timeStamp, double x, double y) { void addPosition(Duration timeStamp, Point position) {
if ((timeStamp - _lastTimeStamp).inMilliseconds >= kAssumePointerMoveStoppedTimeMs) if ((timeStamp - _lastTimeStamp).inMilliseconds >= kAssumePointerMoveStoppedTimeMs)
_strategy.clear(); _strategy.clear();
_lastTimeStamp = timeStamp; _lastTimeStamp = timeStamp;
_strategy.addMovement(timeStamp, x, y); _strategy.addMovement(timeStamp, position);
} }
GestureVelocity getVelocity() { Offset getVelocity() {
_Estimator estimator = new _Estimator(); _Estimator estimator = new _Estimator();
if (_strategy.getEstimator(estimator) && estimator.degree >= 1) { if (_strategy.getEstimator(estimator) && estimator.degree >= 1) {
// convert from pixels/ms to pixels/s return new Offset( // convert from pixels/ms to pixels/s
return new GestureVelocity( estimator.xCoefficients[1] * 1000,
isValid: true, estimator.yCoefficients[1] * 1000
x: estimator.xCoefficients[1] * 1000,
y: estimator.yCoefficients[1] * 1000
); );
} }
return new GestureVelocity(isValid: false, x: 0.0, y: 0.0); return null;
} }
static _VelocityTrackerStrategy _createStrategy() { static _VelocityTrackerStrategy _createStrategy() {
......
...@@ -148,8 +148,8 @@ class _RenderSlider extends RenderConstrainedBox { ...@@ -148,8 +148,8 @@ class _RenderSlider extends RenderConstrainedBox {
bool hitTestSelf(Point position) => true; bool hitTestSelf(Point position) => true;
void handleEvent(InputEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event.type == 'pointerdown' && onChanged != null) if (event is PointerDownEvent && onChanged != null)
_drag.addPointer(event); _drag.addPointer(event);
} }
......
...@@ -164,8 +164,8 @@ class _RenderSwitch extends RenderToggleable { ...@@ -164,8 +164,8 @@ class _RenderSwitch extends RenderToggleable {
reaction.reverse(); reaction.reverse();
} }
void handleEvent(InputEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event.type == 'pointerdown' && onChanged != null) if (event is PointerDownEvent && onChanged != null)
_drag.addPointer(event); _drag.addPointer(event);
super.handleEvent(event, entry); super.handleEvent(event, entry);
} }
......
...@@ -122,8 +122,8 @@ abstract class RenderToggleable extends RenderConstrainedBox { ...@@ -122,8 +122,8 @@ abstract class RenderToggleable extends RenderConstrainedBox {
bool hitTestSelf(Point position) => true; bool hitTestSelf(Point position) => true;
void handleEvent(InputEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
if (event.type == 'pointerdown' && isInteractive) if (event is PointerDownEvent && isInteractive)
_tap.addPointer(event); _tap.addPointer(event);
} }
......
...@@ -7,8 +7,8 @@ import 'dart:ui' as ui; ...@@ -7,8 +7,8 @@ import 'dart:ui' as ui;
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/scheduler.dart'; import 'package:flutter/scheduler.dart';
import 'package:mojo/bindings.dart' as bindings; import 'package:mojo/bindings.dart' as mojo_bindings;
import 'package:mojo/core.dart' as core; import 'package:mojo/core.dart' as mojo_core;
import 'package:sky_services/pointer/pointer.mojom.dart'; import 'package:sky_services/pointer/pointer.mojom.dart';
import 'box.dart'; import 'box.dart';
...@@ -17,119 +17,180 @@ import 'hit_test.dart'; ...@@ -17,119 +17,180 @@ import 'hit_test.dart';
import 'object.dart'; import 'object.dart';
import 'view.dart'; import 'view.dart';
typedef void EventListener(InputEvent event);
typedef void MetricListener(Size size); typedef void MetricListener(Size size);
int _hammingWeight(int value) { class _PointerState {
if (value == 0) _PointerState(this.lastPosition);
return 0;
int weight = 0; int get pointer => _pointer; // the identifier used in PointerEvent objects
for (int i = 0; i < value.bitLength; ++i) { int _pointer;
if (value & (1 << i) != 0) static int _pointerCount = 0;
++weight; void startNewPointer() {
_pointerCount += 1;
_pointer = _pointerCount;
}
bool get down => _down;
bool _down = false;
void setDown() {
assert(!_down);
_down = true;
}
void setUp() {
assert(_down);
_down = false;
} }
return weight;
}
/// State used in converting PointerPackets to PointerInputEvents
class _PointerState {
_PointerState({ this.pointer, this.lastPosition });
int pointer;
Point lastPosition; Point lastPosition;
} }
class _PointerEventConverter { class _PointerEventConverter {
// Map actual input pointer value to a unique value // map from platform pointer identifiers to PointerEvent pointer identifiers
// Since events are serialized we can just use a counter static Map<int, _PointerState> _pointers = <int, _PointerState>{};
static Map<int, _PointerState> _stateForPointer = new Map<int, _PointerState>();
static int _pointerCount = 0; static Iterable<PointerEvent> expand(Iterable<Pointer> packet) sync* {
for (Pointer datum in packet) {
static List<PointerInputEvent> convertPointerPacket(PointerPacket packet) { Point position = new Point(datum.x, datum.y);
return packet.pointers.map(_convertPointer).toList(); Duration timeStamp = new Duration(microseconds: datum.timeStamp);
} assert(_pointerKindMap.containsKey(datum.kind));
PointerDeviceKind kind = _pointerKindMap[datum.kind];
static PointerInputEvent _convertPointer(Pointer pointer) { switch (datum.type) {
Point position = new Point(pointer.x, pointer.y); case PointerType.DOWN:
_PointerState state = _pointers.putIfAbsent(
_PointerState state = _stateForPointer[pointer.pointer]; datum.pointer,
double dx = 0.0; () => new _PointerState(position)
double dy = 0.0; );
String eventType; state.startNewPointer();
switch (pointer.type) { state.setDown();
case PointerType.DOWN: yield new PointerAddedEvent(
eventType = 'pointerdown'; timeStamp: timeStamp,
if (state == null) { pointer: state.pointer,
state = new _PointerState(lastPosition: position); kind: kind,
_stateForPointer[pointer.pointer] = state; position: position,
} obscured: datum.obscured,
state.pointer = _pointerCount; pressureMin: datum.pressureMin,
_pointerCount++; pressureMax: datum.pressureMax,
break; distance: datum.distance,
case PointerType.MOVE: distanceMax: datum.distanceMax,
eventType = 'pointermove'; radiusMin: datum.radiusMin,
// state == null means the pointer is hovering radiusMax: datum.radiusMax,
if (state != null) { orientation: datum.orientation,
dx = position.x - state.lastPosition.x; tilt: datum.tilt
dy = position.y - state.lastPosition.y; );
yield new PointerDownEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
position: position,
obscured: datum.obscured,
pressure: datum.pressure,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
radiusMajor: datum.radiusMajor,
radiusMinor: datum.radiusMajor,
radiusMin: datum.radiusMin,
radiusMax: datum.radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
break;
case PointerType.MOVE:
_PointerState state = _pointers[datum.pointer];
// If the service starts supporting hover pointers, then it must
// also start sending us ADDED and REMOVED data points.
// In the meantime, we only support "down" moves.
// See also: https://github.com/flutter/flutter/issues/720
assert(state != null);
assert(state.down);
Offset offset = position - state.lastPosition;
state.lastPosition = position; state.lastPosition = position;
} yield new PointerMoveEvent(
break; timeStamp: timeStamp,
case PointerType.UP: pointer: state.pointer,
case PointerType.CANCEL: kind: kind,
eventType = (pointer.type == PointerType.UP) ? 'pointerup' : 'pointercancel'; position: position,
// state == null indicates spurious events delta: offset,
if (state != null) { down: state.down,
// Only remove the pointer state when the last button has been released. obscured: datum.obscured,
if (_hammingWeight(pointer.buttons) <= 1) pressure: datum.pressure,
_stateForPointer.remove(pointer.pointer); pressureMin: datum.pressureMin,
} pressureMax: datum.pressureMax,
break; distance: datum.distance,
distanceMax: datum.distanceMax,
radiusMajor: datum.radiusMajor,
radiusMinor: datum.radiusMajor,
radiusMin: datum.radiusMin,
radiusMax: datum.radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
break;
case PointerType.UP:
case PointerType.CANCEL:
_PointerState state = _pointers[datum.pointer];
assert(state != null);
assert(position == state.lastPosition);
state.setUp();
if (datum.type == PointerType.UP) {
yield new PointerUpEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
position: position,
obscured: datum.obscured,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
radiusMin: datum.radiusMin,
radiusMax: datum.radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
} else {
yield new PointerCancelEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
position: position,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
radiusMin: datum.radiusMin,
radiusMax: datum.radiusMax,
orientation: datum.orientation,
tilt: datum.tilt
);
}
yield new PointerRemovedEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
radiusMin: datum.radiusMin,
radiusMax: datum.radiusMax
);
_pointers.remove(datum.pointer);
break;
default:
// TODO(ianh): once https://github.com/flutter/flutter/issues/720 is
// done, add real support for PointerAddedEvent and PointerRemovedEvent
assert(false);
}
} }
int pointerIndex = (state == null) ? pointer.pointer : state.pointer;
return new PointerInputEvent(
type: eventType,
timeStamp: new Duration(microseconds: pointer.timeStamp),
pointer: pointerIndex,
kind: _mapPointerKindToString(pointer.kind),
x: pointer.x,
y: pointer.y,
dx: dx,
dy: dy,
buttons: pointer.buttons,
down: pointer.down,
primary: pointer.primary,
obscured: pointer.obscured,
pressure: pointer.pressure,
pressureMin: pointer.pressureMin,
pressureMax: pointer.pressureMax,
distance: pointer.distance,
distanceMin: pointer.distanceMin,
distanceMax: pointer.distanceMax,
radiusMajor: pointer.radiusMajor,
radiusMinor: pointer.radiusMinor,
radiusMin: pointer.radiusMin,
radiusMax: pointer.radiusMax,
orientation: pointer.orientation,
tilt: pointer.tilt
);
} }
static String _mapPointerKindToString(PointerKind kind) { static const Map<PointerKind, PointerDeviceKind> _pointerKindMap = const <PointerKind, PointerDeviceKind>{
switch (kind) { PointerKind.TOUCH: PointerDeviceKind.touch,
case PointerKind.TOUCH: PointerKind.MOUSE: PointerDeviceKind.mouse,
return 'touch'; PointerKind.STYLUS: PointerDeviceKind.stylus,
case PointerKind.MOUSE: PointerKind.INVERTED_STYLUS: PointerDeviceKind.invertedStylus,
return 'mouse'; };
case PointerKind.STYLUS:
return 'stylus';
case PointerKind.INVERTED_STYLUS:
return 'invertedStylus';
}
assert(false);
return '';
}
} }
class BindingObserver { class BindingObserver {
...@@ -202,53 +263,40 @@ class FlutterBinding extends HitTestTarget { ...@@ -202,53 +263,40 @@ class FlutterBinding extends HitTestTarget {
} }
void _handlePointerPacket(ByteData serializedPacket) { void _handlePointerPacket(ByteData serializedPacket) {
bindings.Message message = new bindings.Message( final mojo_bindings.Message message = new mojo_bindings.Message(
serializedPacket, serializedPacket,
<core.MojoHandle>[], <mojo_core.MojoHandle>[],
serializedPacket.lengthInBytes, serializedPacket.lengthInBytes,
0); 0
PointerPacket packet = PointerPacket.deserialize(message); );
for (PointerInputEvent event in _PointerEventConverter.convertPointerPacket(packet)) { final PointerPacket packet = PointerPacket.deserialize(message);
_handlePointerInputEvent(event); for (PointerEvent event in _PointerEventConverter.expand(packet.pointers))
} _handlePointerEvent(event);
} }
/// A router that routes all pointer events received from the engine /// A router that routes all pointer events received from the engine
final PointerRouter pointerRouter = new PointerRouter(); final PointerRouter pointerRouter = new PointerRouter();
/// State for all pointers which are currently down. /// State for all pointers which are currently down.
/// We do not track the state of hovering pointers because we need /// The state of hovering pointers is not tracked because that would require
/// to hit-test them on each movement. /// hit-testing on every fram.e
Map<int, HitTestResult> _resultForPointer = new Map<int, HitTestResult>(); Map<int, HitTestResult> _hitTests = <int, HitTestResult>{};
void _handlePointerInputEvent(PointerInputEvent event) { void _handlePointerEvent(PointerEvent event) {
HitTestResult result = _resultForPointer[event.pointer]; if (event is PointerDownEvent) {
switch (event.type) { assert(!_hitTests.containsKey(event.pointer));
case 'pointerdown': _hitTests[event.pointer] = hitTest(event.position);
if (result == null) { } else if (event is! PointerUpEvent) {
result = hitTest(new Point(event.x, event.y)); assert(event.down == _hitTests.containsKey(event.pointer));
_resultForPointer[event.pointer] = result; if (!event.down)
} return; // we currently ignore add, remove, and hover move events
break; }
case 'pointermove': assert(_hitTests[event.pointer] != null);
if (result == null) { dispatchEvent(event, _hitTests[event.pointer]);
// The pointer is hovering, ignore it for now since we don't if (event is PointerUpEvent) {
// know what to do with it yet. assert(_hitTests.containsKey(event.pointer));
return; _hitTests.remove(event.pointer);
}
break;
case 'pointerup':
case 'pointercancel':
if (result == null) {
// This seems to be a spurious event. Ignore it.
return;
}
// Only remove the hit test result when the last button has been released.
if (_hammingWeight(event.buttons) <= 1)
_resultForPointer.remove(event.pointer);
break;
} }
dispatchEvent(event, result);
} }
/// Determine which [HitTestTarget] objects are located at a given position /// Determine which [HitTestTarget] objects are located at a given position
...@@ -260,20 +308,18 @@ class FlutterBinding extends HitTestTarget { ...@@ -260,20 +308,18 @@ class FlutterBinding extends HitTestTarget {
} }
/// Dispatch the given event to the path of the given hit test result /// Dispatch the given event to the path of the given hit test result
void dispatchEvent(InputEvent event, HitTestResult result) { void dispatchEvent(PointerEvent event, HitTestResult result) {
assert(result != null); assert(result != null);
for (HitTestEntry entry in result.path) for (HitTestEntry entry in result.path)
entry.target.handleEvent(event, entry); entry.target.handleEvent(event, entry);
} }
void handleEvent(InputEvent e, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
if (e is PointerInputEvent) { pointerRouter.route(event);
PointerInputEvent event = e; if (event is PointerDownEvent) {
pointerRouter.route(event); GestureArena.instance.close(event.pointer);
if (event.type == 'pointerdown') } else if (event is PointerUpEvent) {
GestureArena.instance.close(event.pointer); GestureArena.instance.sweep(event.pointer);
else if (event.type == 'pointerup')
GestureArena.instance.sweep(event.pointer);
} }
} }
} }
......
...@@ -636,14 +636,15 @@ abstract class RenderBox extends RenderObject { ...@@ -636,14 +636,15 @@ abstract class RenderBox extends RenderObject {
Rect get paintBounds => Point.origin & size; Rect get paintBounds => Point.origin & size;
int _debugActivePointers = 0; int _debugActivePointers = 0;
void handleEvent(InputEvent event, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
super.handleEvent(event, entry); super.handleEvent(event, entry);
assert(() { assert(() {
if (debugPaintPointersEnabled) { if (debugPaintPointersEnabled) {
if (event.type == 'pointerdown') if (event is PointerDownEvent) {
_debugActivePointers += 1; _debugActivePointers += 1;
if (event.type == 'pointerup' || event.type == 'pointercancel') } else if (event is PointerUpEvent || event is PointerCancelEvent) {
_debugActivePointers -= 1; _debugActivePointers -= 1;
}
markNeedsPaint(); markNeedsPaint();
} }
return true; return true;
......
...@@ -7,7 +7,7 @@ import 'package:flutter/gestures.dart'; ...@@ -7,7 +7,7 @@ import 'package:flutter/gestures.dart';
/// An object that can handle events. /// An object that can handle events.
abstract class HitTestTarget { abstract class HitTestTarget {
/// Override this function to receive events. /// Override this function to receive events.
void handleEvent(InputEvent event, HitTestEntry entry); void handleEvent(PointerEvent event, HitTestEntry entry);
} }
/// Data collected during a hit test about a specific [HitTestTarget]. /// Data collected during a hit test about a specific [HitTestTarget].
......
...@@ -1045,8 +1045,8 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget { ...@@ -1045,8 +1045,8 @@ abstract class RenderObject extends AbstractNode implements HitTestTarget {
// EVENTS // EVENTS
/// Override this function to handle events that hit this render object /// Override this function to handle pointer events that hit this render object.
void handleEvent(InputEvent event, HitTestEntry entry) { } void handleEvent(PointerEvent event, HitTestEntry entry) { }
// HIT TESTING // HIT TESTING
......
...@@ -1072,7 +1072,10 @@ class RenderCustomPaint extends RenderProxyBox { ...@@ -1072,7 +1072,10 @@ class RenderCustomPaint extends RenderProxyBox {
} }
} }
typedef void PointerEventListener(PointerInputEvent event); typedef void PointerDownEventListener(PointerDownEvent event);
typedef void PointerMoveEventListener(PointerMoveEvent event);
typedef void PointerUpEventListener(PointerUpEvent event);
typedef void PointerCancelEventListener(PointerCancelEvent event);
enum HitTestBehavior { enum HitTestBehavior {
deferToChild, deferToChild,
...@@ -1091,10 +1094,10 @@ class RenderPointerListener extends RenderProxyBox { ...@@ -1091,10 +1094,10 @@ class RenderPointerListener extends RenderProxyBox {
RenderBox child RenderBox child
}) : super(child); }) : super(child);
PointerEventListener onPointerDown; PointerDownEventListener onPointerDown;
PointerEventListener onPointerMove; PointerMoveEventListener onPointerMove;
PointerEventListener onPointerUp; PointerUpEventListener onPointerUp;
PointerEventListener onPointerCancel; PointerCancelEventListener onPointerCancel;
HitTestBehavior behavior; HitTestBehavior behavior;
bool hitTest(HitTestResult result, { Point position }) { bool hitTest(HitTestResult result, { Point position }) {
...@@ -1110,14 +1113,14 @@ class RenderPointerListener extends RenderProxyBox { ...@@ -1110,14 +1113,14 @@ class RenderPointerListener extends RenderProxyBox {
bool hitTestSelf(Point position) => behavior == HitTestBehavior.opaque; bool hitTestSelf(Point position) => behavior == HitTestBehavior.opaque;
void handleEvent(InputEvent event, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
if (onPointerDown != null && event.type == 'pointerdown') if (onPointerDown != null && event is PointerDownEvent)
return onPointerDown(event); return onPointerDown(event);
if (onPointerMove != null && event.type == 'pointermove') if (onPointerMove != null && event == PointerMoveEvent)
return onPointerMove(event); return onPointerMove(event);
if (onPointerUp != null && event.type == 'pointerup') if (onPointerUp != null && event == PointerUpEvent)
return onPointerUp(event); return onPointerUp(event);
if (onPointerCancel != null && event.type == 'pointercancel') if (onPointerCancel != null && event == PointerCancelEvent)
return onPointerCancel(event); return onPointerCancel(event);
} }
......
...@@ -1299,10 +1299,10 @@ class Listener extends OneChildRenderObjectWidget { ...@@ -1299,10 +1299,10 @@ class Listener extends OneChildRenderObjectWidget {
assert(behavior != null); assert(behavior != null);
} }
final PointerEventListener onPointerDown; final PointerDownEventListener onPointerDown;
final PointerEventListener onPointerMove; final PointerMoveEventListener onPointerMove;
final PointerEventListener onPointerUp; final PointerUpEventListener onPointerUp;
final PointerEventListener onPointerCancel; final PointerCancelEventListener onPointerCancel;
final HitTestBehavior behavior; final HitTestBehavior behavior;
RenderPointerListener createRenderObject() => new RenderPointerListener( RenderPointerListener createRenderObject() => new RenderPointerListener(
......
...@@ -135,7 +135,7 @@ class _DraggableState<T> extends State<DraggableBase<T>> implements GestureArena ...@@ -135,7 +135,7 @@ class _DraggableState<T> extends State<DraggableBase<T>> implements GestureArena
GestureRecognizer _recognizer; GestureRecognizer _recognizer;
Map<int, GestureArenaEntry> _activePointers = <int, GestureArenaEntry>{}; Map<int, GestureArenaEntry> _activePointers = <int, GestureArenaEntry>{};
void _routePointer(PointerInputEvent event) { void _routePointer(PointerEvent event) {
_activePointers[event.pointer] = GestureArena.instance.add(event.pointer, this); _activePointers[event.pointer] = GestureArena.instance.add(event.pointer, this);
_recognizer.addPointer(event); _recognizer.addPointer(event);
} }
...@@ -284,18 +284,14 @@ class _DragAvatar<T> { ...@@ -284,18 +284,14 @@ class _DragAvatar<T> {
Offset _lastOffset; Offset _lastOffset;
OverlayEntry _entry; OverlayEntry _entry;
void handleEvent(PointerInputEvent event) { void handleEvent(PointerEvent event) {
switch(event.type) { if (event is PointerUpEvent) {
case 'pointerup': update(event.position);
update(event.position); finish(_DragEndKind.dropped);
finish(_DragEndKind.dropped); } else if (event is PointerCancelEvent) {
break; finish(_DragEndKind.canceled);
case 'pointercancel': } else if (event is PointerMoveEvent) {
finish(_DragEndKind.canceled); update(event.position);
break;
case 'pointermove':
update(event.position);
break;
} }
} }
......
...@@ -3,7 +3,6 @@ ...@@ -3,7 +3,6 @@
// found in the LICENSE file. // found in the LICENSE file.
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:flutter/rendering.dart';
import 'basic.dart'; import 'basic.dart';
import 'framework.dart'; import 'framework.dart';
...@@ -13,7 +12,7 @@ enum EventRecorderMode { ...@@ -13,7 +12,7 @@ enum EventRecorderMode {
record record
} }
typedef void EventsReadyCallback(List<PointerInputEvent> events); typedef void EventsReadyCallback(Iterable<PointerEvent> events);
/// EventRecorder is a utility widget that allows input events occurring /// EventRecorder is a utility widget that allows input events occurring
/// on the child to be recorded. The widget is initially in the "stop" state /// on the child to be recorded. The widget is initially in the "stop" state
...@@ -38,11 +37,7 @@ class EventRecorder extends StatefulComponent { ...@@ -38,11 +37,7 @@ class EventRecorder extends StatefulComponent {
class _EventRecorderState extends State<EventRecorder> { class _EventRecorderState extends State<EventRecorder> {
List<PointerInputEvent> _events = new List<PointerInputEvent>(); final List<PointerEvent> _events = <PointerEvent>[];
void initState() {
super.initState();
}
void didUpdateConfig(EventRecorder oldConfig) { void didUpdateConfig(EventRecorder oldConfig) {
if (oldConfig.mode == EventRecorderMode.record && if (oldConfig.mode == EventRecorderMode.record &&
...@@ -52,10 +47,9 @@ class _EventRecorderState extends State<EventRecorder> { ...@@ -52,10 +47,9 @@ class _EventRecorderState extends State<EventRecorder> {
} }
} }
void _recordEvent(PointerInputEvent event) { void _recordEvent(PointerEvent event) {
if (config.mode == EventRecorderMode.record) { if (config.mode == EventRecorderMode.record)
_events.add(event); _events.add(event);
}
} }
Widget build(BuildContext context) { Widget build(BuildContext context) {
......
...@@ -210,7 +210,7 @@ class _GestureDetectorState extends State<GestureDetector> { ...@@ -210,7 +210,7 @@ class _GestureDetectorState extends State<GestureDetector> {
return null; return null;
} }
void _handlePointerDown(PointerInputEvent event) { void _handlePointerDown(PointerDownEvent event) {
if (_tap != null) if (_tap != null)
_tap.addPointer(event); _tap.addPointer(event);
if (_doubleTap != null) if (_doubleTap != null)
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
// Use of this source code is governed by a BSD-style license that can be // Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. // found in the LICENSE file.
import 'dart:ui' as ui;
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
export 'dart:ui' show Point; export 'dart:ui' show Point;
...@@ -13,57 +11,48 @@ class TestPointer { ...@@ -13,57 +11,48 @@ class TestPointer {
int pointer; int pointer;
bool isDown = false; bool isDown = false;
ui.Point location; Point location;
PointerInputEvent down(ui.Point newLocation, { Duration timeStamp: const Duration() }) { PointerDownEvent down(Point newLocation, { Duration timeStamp: const Duration() }) {
assert(!isDown); assert(!isDown);
isDown = true; isDown = true;
location = newLocation; location = newLocation;
return new PointerInputEvent( return new PointerDownEvent(
type: 'pointerdown', timeStamp: timeStamp,
pointer: pointer, pointer: pointer,
x: location.x, position: location
y: location.y,
timeStamp: timeStamp
); );
} }
PointerInputEvent move(ui.Point newLocation, { Duration timeStamp: const Duration() }) { PointerMoveEvent move(Point newLocation, { Duration timeStamp: const Duration() }) {
assert(isDown); assert(isDown);
ui.Offset delta = newLocation - location; Offset delta = newLocation - location;
location = newLocation; location = newLocation;
return new PointerInputEvent( return new PointerMoveEvent(
type: 'pointermove', timeStamp: timeStamp,
pointer: pointer, pointer: pointer,
x: newLocation.x, position: newLocation,
y: newLocation.y, delta: delta
dx: delta.dx,
dy: delta.dy,
timeStamp: timeStamp
); );
} }
PointerInputEvent up({ Duration timeStamp: const Duration() }) { PointerUpEvent up({ Duration timeStamp: const Duration() }) {
assert(isDown); assert(isDown);
isDown = false; isDown = false;
return new PointerInputEvent( return new PointerUpEvent(
type: 'pointerup', timeStamp: timeStamp,
pointer: pointer, pointer: pointer,
x: location.x, position: location
y: location.y,
timeStamp: timeStamp
); );
} }
PointerInputEvent cancel({ Duration timeStamp: const Duration() }) { PointerCancelEvent cancel({ Duration timeStamp: const Duration() }) {
assert(isDown); assert(isDown);
isDown = false; isDown = false;
return new PointerInputEvent( return new PointerCancelEvent(
type: 'pointercancel', timeStamp: timeStamp,
pointer: pointer, pointer: pointer,
x: location.x, position: location
y: location.y,
timeStamp: timeStamp
); );
} }
......
...@@ -174,13 +174,13 @@ class WidgetTester { ...@@ -174,13 +174,13 @@ class WidgetTester {
_dispatchEvent(p.up(), result); _dispatchEvent(p.up(), result);
} }
void dispatchEvent(InputEvent event, Point location) { void dispatchEvent(PointerEvent event, Point location) {
_dispatchEvent(event, _hitTest(location)); _dispatchEvent(event, _hitTest(location));
} }
HitTestResult _hitTest(Point location) => WidgetFlutterBinding.instance.hitTest(location); HitTestResult _hitTest(Point location) => WidgetFlutterBinding.instance.hitTest(location);
void _dispatchEvent(InputEvent event, HitTestResult result) { void _dispatchEvent(PointerEvent event, HitTestResult result) {
WidgetFlutterBinding.instance.dispatchEvent(event, result); WidgetFlutterBinding.instance.dispatchEvent(event, result);
} }
......
# Benchmarks # Benchmarks
This directory (and its sub-directories) contain benchmarks for Flutter. This directory (and its sub-directories) contain benchmarks for
The reporting format for benchmarks is not standardized yet, so benchmarks Flutter. The reporting format for benchmarks is not standardized yet,
here are typically run by hand. To run a benchmark: so benchmarks here are typically run by hand. To run a benchmark:
1. Build `sky_shell` for Linux Release using the instructions in the 1. Build `sky_shell` for Linux Release using the instructions in the
[Engine repository](https://github.com/flutter/engine). [Engine repository](https://github.com/flutter/engine).
2. Run `pub get` in the `packages/unit` directory. 2. Run `pub get` in the `packages/unit` directory.
3. Run the benchmark: 3. Run the benchmarks by running the following command from the root
of the flutter repository (replacing `stocks/layout_bench.dart`
with the path to whichever benchmark you want to run):
``` ```
/path/to/engine/src/out/Release/sky_shell packages/unit/benchmark/stocks/layout_bench.dart --package-root=packages/unit/package /path/to/engine/src/out/Release/sky_shell packages/unit/benchmark/stocks/layout_bench.dart --package-root=packages/unit/packages
``` ```
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
import 'velocity_tracker_data.dart'; import 'velocity_tracker_data.dart';
...@@ -7,36 +11,16 @@ const int kBatchSize = 1000; ...@@ -7,36 +11,16 @@ const int kBatchSize = 1000;
const int kBatchOffset = 50; const int kBatchOffset = 50;
const int kNumMarks = 130; const int kNumMarks = 130;
List<PointerInputEvent> _eventFromMap(List<Map> intermediate) {
List<PointerInputEvent> events = new List<PointerInputEvent>();
for (Map entry in intermediate)
events.add(_eventFor(entry));
return events;
}
PointerInputEvent _eventFor(Map entry) {
PointerInputEvent result = new PointerInputEvent(
type: entry['type'],
timeStamp: entry['timeStamp'],
pointer: entry['pointer'],
x: entry['x'],
y: entry['y']
);
return result;
}
void main() { void main() {
List<PointerInputEvent> events = _eventFromMap(velocityEventData);
test('Dart velocity tracker performance', () { test('Dart velocity tracker performance', () {
VelocityTracker tracker = new VelocityTracker(); VelocityTracker tracker = new VelocityTracker();
Stopwatch watch = new Stopwatch(); Stopwatch watch = new Stopwatch();
watch.start(); watch.start();
for (int i = 0; i < kNumIters; i++) { for (int i = 0; i < kNumIters; i++) {
for (PointerInputEvent event in events) { for (PointerEvent event in velocityEventData) {
if (event.type == 'pointerdown' || event.type == 'pointermove') if (event is PointerDownEvent || event is PointerMoveEvent)
tracker.addPosition(event.timeStamp, event.x, event.y); tracker.addPosition(event.timeStamp, event.position);
if (event.type == 'pointerup') if (event is PointerUpEvent)
tracker.getVelocity(); tracker.getVelocity();
} }
} }
......
final List<Map> velocityEventData = [ import 'package:flutter/gestures.dart';
{
"type":"pointerdown", final List<PointerEvent> velocityEventData = <PointerEvent>[
"timeStamp":216690896.0, const PointerDownEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216690896),
"x":270.0, pointer: 1,
"y":538.2857055664062 position: const Point(270.0, 538.2857055664062)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216690906),
"timeStamp":216690906.0, pointer: 1,
"pointer":1, position: const Point(270.0, 538.2857055664062)
"x":270.0, ),
"y":538.2857055664062 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216690951),
{ pointer: 1,
"type":"pointermove", position: const Point(270.0, 530.8571166992188)
"timeStamp":216690951.0, ),
"pointer":1, const PointerMoveEvent(
"x":270.0, timeStamp: const Duration(milliseconds: 216690959),
"y":530.8571166992188 pointer: 1,
}, position: const Point(270.0, 526.8571166992188)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216690959.0, timeStamp: const Duration(milliseconds: 216690967),
"pointer":1, pointer: 1,
"x":270.0, position: const Point(270.0, 521.4285888671875)
"y":526.8571166992188 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216690975),
"type":"pointermove", pointer: 1,
"timeStamp":216690967.0, position: const Point(270.0, 515.4285888671875)
"pointer":1, ),
"x":270.0, const PointerMoveEvent(
"y":521.4285888671875 timeStamp: const Duration(milliseconds: 216690983),
}, pointer: 1,
{ position: const Point(270.0, 506.8571472167969)
"type":"pointermove", ),
"timeStamp":216690975.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216690991),
"x":270.0, pointer: 1,
"y":515.4285888671875 position: const Point(268.8571472167969, 496.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216690998),
"timeStamp":216690983.0, pointer: 1,
"pointer":1, position: const Point(267.4285583496094, 483.1428527832031)
"x":270.0, ),
"y":506.8571472167969 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691006),
{ pointer: 1,
"type":"pointermove", position: const Point(266.28570556640625, 469.71429443359375)
"timeStamp":216690991.0, ),
"pointer":1, const PointerMoveEvent(
"x":268.8571472167969, timeStamp: const Duration(milliseconds: 216691014),
"y":496.0 pointer: 1,
}, position: const Point(265.4285583496094, 456.8571472167969)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216690998.0, timeStamp: const Duration(milliseconds: 216691021),
"pointer":1, pointer: 1,
"x":267.4285583496094, position: const Point(264.28570556640625, 443.71429443359375)
"y":483.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691029),
"type":"pointermove", pointer: 1,
"timeStamp":216691006.0, position: const Point(264.0, 431.71429443359375)
"pointer":1, ),
"x":266.28570556640625, const PointerMoveEvent(
"y":469.71429443359375 timeStamp: const Duration(milliseconds: 216691036),
}, pointer: 1,
{ position: const Point(263.4285583496094, 421.1428527832031)
"type":"pointermove", ),
"timeStamp":216691014.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691044),
"x":265.4285583496094, pointer: 1,
"y":456.8571472167969 position: const Point(263.4285583496094, 412.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691052),
"timeStamp":216691021.0, pointer: 1,
"pointer":1, position: const Point(263.4285583496094, 404.5714416503906)
"x":264.28570556640625, ),
"y":443.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691060),
{ pointer: 1,
"type":"pointermove", position: const Point(263.4285583496094, 396.5714416503906)
"timeStamp":216691029.0, ),
"pointer":1, const PointerMoveEvent(
"x":264.0, timeStamp: const Duration(milliseconds: 216691068),
"y":431.71429443359375 pointer: 1,
}, position: const Point(264.5714416503906, 390.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691036.0, timeStamp: const Duration(milliseconds: 216691075),
"pointer":1, pointer: 1,
"x":263.4285583496094, position: const Point(265.1428527832031, 384.8571472167969)
"y":421.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691083),
"type":"pointermove", pointer: 1,
"timeStamp":216691044.0, position: const Point(266.0, 380.28570556640625)
"pointer":1, ),
"x":263.4285583496094, const PointerMoveEvent(
"y":412.5714416503906 timeStamp: const Duration(milliseconds: 216691091),
}, pointer: 1,
{ position: const Point(266.5714416503906, 376.28570556640625)
"type":"pointermove", ),
"timeStamp":216691052.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691098),
"x":263.4285583496094, pointer: 1,
"y":404.5714416503906 position: const Point(267.1428527832031, 373.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691106),
"timeStamp":216691060.0, pointer: 1,
"pointer":1, position: const Point(267.71429443359375, 370.28570556640625)
"x":263.4285583496094, ),
"y":396.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691114),
{ pointer: 1,
"type":"pointermove", position: const Point(268.28570556640625, 367.71429443359375)
"timeStamp":216691068.0, ),
"pointer":1, const PointerMoveEvent(
"x":264.5714416503906, timeStamp: const Duration(milliseconds: 216691121),
"y":390.0 pointer: 1,
}, position: const Point(268.5714416503906, 366.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691075.0, timeStamp: const Duration(milliseconds: 216691130),
"pointer":1, pointer: 1,
"x":265.1428527832031, position: const Point(268.8571472167969, 364.5714416503906)
"y":384.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691137),
"type":"pointermove", pointer: 1,
"timeStamp":216691083.0, position: const Point(269.1428527832031, 363.71429443359375)
"pointer":1, ),
"x":266.0, const PointerMoveEvent(
"y":380.28570556640625 timeStamp: const Duration(milliseconds: 216691145),
}, pointer: 1,
{ position: const Point(269.1428527832031, 362.8571472167969)
"type":"pointermove", ),
"timeStamp":216691091.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691153),
"x":266.5714416503906, pointer: 1,
"y":376.28570556640625 position: const Point(269.4285583496094, 362.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691168),
"timeStamp":216691098.0, pointer: 1,
"pointer":1, position: const Point(268.5714416503906, 365.4285583496094)
"x":267.1428527832031, ),
"y":373.1428527832031 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691176),
{ pointer: 1,
"type":"pointermove", position: const Point(267.1428527832031, 370.28570556640625)
"timeStamp":216691106.0, ),
"pointer":1, const PointerMoveEvent(
"x":267.71429443359375, timeStamp: const Duration(milliseconds: 216691183),
"y":370.28570556640625 pointer: 1,
}, position: const Point(265.4285583496094, 376.8571472167969)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691114.0, timeStamp: const Duration(milliseconds: 216691191),
"pointer":1, pointer: 1,
"x":268.28570556640625, position: const Point(263.1428527832031, 385.71429443359375)
"y":367.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691199),
"type":"pointermove", pointer: 1,
"timeStamp":216691121.0, position: const Point(261.4285583496094, 396.5714416503906)
"pointer":1, ),
"x":268.5714416503906, const PointerMoveEvent(
"y":366.0 timeStamp: const Duration(milliseconds: 216691207),
}, pointer: 1,
{ position: const Point(259.71429443359375, 408.5714416503906)
"type":"pointermove", ),
"timeStamp":216691130.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691215),
"x":268.8571472167969, pointer: 1,
"y":364.5714416503906 position: const Point(258.28570556640625, 419.4285583496094)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691222),
"timeStamp":216691137.0, pointer: 1,
"pointer":1, position: const Point(257.4285583496094, 428.5714416503906)
"x":269.1428527832031, ),
"y":363.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691230),
{ pointer: 1,
"type":"pointermove", position: const Point(256.28570556640625, 436.0)
"timeStamp":216691145.0, ),
"pointer":1, const PointerMoveEvent(
"x":269.1428527832031, timeStamp: const Duration(milliseconds: 216691238),
"y":362.8571472167969 pointer: 1,
}, position: const Point(255.7142791748047, 442.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691153.0, timeStamp: const Duration(milliseconds: 216691245),
"pointer":1, pointer: 1,
"x":269.4285583496094, position: const Point(255.14285278320312, 447.71429443359375)
"y":362.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691253),
"type":"pointermove", pointer: 1,
"timeStamp":216691168.0, position: const Point(254.85714721679688, 453.1428527832031)
"pointer":1, ),
"x":268.5714416503906, const PointerMoveEvent(
"y":365.4285583496094 timeStamp: const Duration(milliseconds: 216691261),
}, pointer: 1,
{ position: const Point(254.57142639160156, 458.5714416503906)
"type":"pointermove", ),
"timeStamp":216691176.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691268),
"x":267.1428527832031, pointer: 1,
"y":370.28570556640625 position: const Point(254.2857208251953, 463.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691276),
"timeStamp":216691183.0, pointer: 1,
"pointer":1, position: const Point(254.2857208251953, 470.28570556640625)
"x":265.4285583496094, ),
"y":376.8571472167969 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691284),
{ pointer: 1,
"type":"pointermove", position: const Point(254.2857208251953, 477.71429443359375)
"timeStamp":216691191.0, ),
"pointer":1, const PointerMoveEvent(
"x":263.1428527832031, timeStamp: const Duration(milliseconds: 216691292),
"y":385.71429443359375 pointer: 1,
}, position: const Point(255.7142791748047, 487.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691199.0, timeStamp: const Duration(milliseconds: 216691300),
"pointer":1, pointer: 1,
"x":261.4285583496094, position: const Point(256.8571472167969, 498.5714416503906)
"y":396.5714416503906 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691307),
"type":"pointermove", pointer: 1,
"timeStamp":216691207.0, position: const Point(258.28570556640625, 507.71429443359375)
"pointer":1, ),
"x":259.71429443359375, const PointerMoveEvent(
"y":408.5714416503906 timeStamp: const Duration(milliseconds: 216691315),
}, pointer: 1,
{ position: const Point(259.4285583496094, 516.0)
"type":"pointermove", ),
"timeStamp":216691215.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691323),
"x":258.28570556640625, pointer: 1,
"y":419.4285583496094 position: const Point(260.28570556640625, 521.7142944335938)
}, ),
{ const PointerUpEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691338),
"timeStamp":216691222.0, pointer: 1,
"pointer":1, position: const Point(260.28570556640625, 521.7142944335938)
"x":257.4285583496094, ),
"y":428.5714416503906 const PointerDownEvent(
}, timeStamp: const Duration(milliseconds: 216691573),
{ pointer: 2,
"type":"pointermove", position: const Point(266.0, 327.4285583496094)
"timeStamp":216691230.0, ),
"pointer":1, const PointerMoveEvent(
"x":256.28570556640625, timeStamp: const Duration(milliseconds: 216691588),
"y":436.0 pointer: 2,
}, position: const Point(266.0, 327.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691238.0, timeStamp: const Duration(milliseconds: 216691626),
"pointer":1, pointer: 2,
"x":255.7142791748047, position: const Point(261.1428527832031, 337.1428527832031)
"y":442.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691634),
"type":"pointermove", pointer: 2,
"timeStamp":216691245.0, position: const Point(258.28570556640625, 343.1428527832031)
"pointer":1, ),
"x":255.14285278320312, const PointerMoveEvent(
"y":447.71429443359375 timeStamp: const Duration(milliseconds: 216691642),
}, pointer: 2,
{ position: const Point(254.57142639160156, 354.0)
"type":"pointermove", ),
"timeStamp":216691253.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691650),
"x":254.85714721679688, pointer: 2,
"y":453.1428527832031 position: const Point(250.2857208251953, 368.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691657),
"timeStamp":216691261.0, pointer: 2,
"pointer":1, position: const Point(247.42857360839844, 382.8571472167969)
"x":254.57142639160156, ),
"y":458.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691665),
{ pointer: 2,
"type":"pointermove", position: const Point(245.14285278320312, 397.4285583496094)
"timeStamp":216691268.0, ),
"pointer":1, const PointerMoveEvent(
"x":254.2857208251953, timeStamp: const Duration(milliseconds: 216691673),
"y":463.71429443359375 pointer: 2,
}, position: const Point(243.14285278320312, 411.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691276.0, timeStamp: const Duration(milliseconds: 216691680),
"pointer":1, pointer: 2,
"x":254.2857208251953, position: const Point(242.2857208251953, 426.28570556640625)
"y":470.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691688),
"type":"pointermove", pointer: 2,
"timeStamp":216691284.0, position: const Point(241.7142791748047, 440.5714416503906)
"pointer":1, ),
"x":254.2857208251953, const PointerMoveEvent(
"y":477.71429443359375 timeStamp: const Duration(milliseconds: 216691696),
}, pointer: 2,
{ position: const Point(241.7142791748047, 454.5714416503906)
"type":"pointermove", ),
"timeStamp":216691292.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691703),
"x":255.7142791748047, pointer: 2,
"y":487.1428527832031 position: const Point(242.57142639160156, 467.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691712),
"timeStamp":216691300.0, pointer: 2,
"pointer":1, position: const Point(243.42857360839844, 477.4285583496094)
"x":256.8571472167969, ),
"y":498.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691720),
{ pointer: 2,
"type":"pointermove", position: const Point(244.85714721679688, 485.71429443359375)
"timeStamp":216691307.0, ),
"pointer":1, const PointerMoveEvent(
"x":258.28570556640625, timeStamp: const Duration(milliseconds: 216691727),
"y":507.71429443359375 pointer: 2,
}, position: const Point(246.2857208251953, 493.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691315.0, timeStamp: const Duration(milliseconds: 216691735),
"pointer":1, pointer: 2,
"x":259.4285583496094, position: const Point(248.0, 499.71429443359375)
"y":516.0 ),
}, const PointerUpEvent(
{ timeStamp: const Duration(milliseconds: 216691750),
"type":"pointermove", pointer: 2,
"timeStamp":216691323.0, position: const Point(248.0, 499.71429443359375)
"pointer":1, ),
"x":260.28570556640625, const PointerDownEvent(
"y":521.7142944335938 timeStamp: const Duration(milliseconds: 216692255),
}, pointer: 3,
{ position: const Point(249.42857360839844, 351.4285583496094)
"type":"pointerup", ),
"timeStamp":216691338.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216692270),
"x":260.28570556640625, pointer: 3,
"y":521.7142944335938 position: const Point(249.42857360839844, 351.4285583496094)
}, ),
{ const PointerMoveEvent(
"type":"pointerdown", timeStamp: const Duration(milliseconds: 216692309),
"timeStamp":216691573.0, pointer: 3,
"pointer":2, position: const Point(246.2857208251953, 361.71429443359375)
"x":266.0, ),
"y":327.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692317),
{ pointer: 3,
"type":"pointermove", position: const Point(244.0, 368.5714416503906)
"timeStamp":216691588.0, ),
"pointer":2, const PointerMoveEvent(
"x":266.0, timeStamp: const Duration(milliseconds: 216692325),
"y":327.4285583496094 pointer: 3,
}, position: const Point(241.42857360839844, 377.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691626.0, timeStamp: const Duration(milliseconds: 216692333),
"pointer":2, pointer: 3,
"x":261.1428527832031, position: const Point(237.7142791748047, 391.71429443359375)
"y":337.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692340),
"type":"pointermove", pointer: 3,
"timeStamp":216691634.0, position: const Point(235.14285278320312, 406.5714416503906)
"pointer":2, ),
"x":258.28570556640625, const PointerMoveEvent(
"y":343.1428527832031 timeStamp: const Duration(milliseconds: 216692348),
}, pointer: 3,
{ position: const Point(232.57142639160156, 421.4285583496094)
"type":"pointermove", ),
"timeStamp":216691642.0, const PointerMoveEvent(
"pointer":2, timeStamp: const Duration(milliseconds: 216692356),
"x":254.57142639160156, pointer: 3,
"y":354.0 position: const Point(230.2857208251953, 436.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692363),
"timeStamp":216691650.0, pointer: 3,
"pointer":2, position: const Point(228.2857208251953, 451.71429443359375)
"x":250.2857208251953, ),
"y":368.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692371),
{ pointer: 3,
"type":"pointermove", position: const Point(227.42857360839844, 466.0)
"timeStamp":216691657.0, ),
"pointer":2, const PointerMoveEvent(
"x":247.42857360839844, timeStamp: const Duration(milliseconds: 216692378),
"y":382.8571472167969 pointer: 3,
}, position: const Point(226.2857208251953, 479.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691665.0, timeStamp: const Duration(milliseconds: 216692387),
"pointer":2, pointer: 3,
"x":245.14285278320312, position: const Point(225.7142791748047, 491.71429443359375)
"y":397.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692395),
"type":"pointermove", pointer: 3,
"timeStamp":216691673.0, position: const Point(225.14285278320312, 501.71429443359375)
"pointer":2, ),
"x":243.14285278320312, const PointerMoveEvent(
"y":411.71429443359375 timeStamp: const Duration(milliseconds: 216692402),
}, pointer: 3,
{ position: const Point(224.85714721679688, 509.1428527832031)
"type":"pointermove", ),
"timeStamp":216691680.0, const PointerMoveEvent(
"pointer":2, timeStamp: const Duration(milliseconds: 216692410),
"x":242.2857208251953, pointer: 3,
"y":426.28570556640625 position: const Point(224.57142639160156, 514.8571166992188)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692418),
"timeStamp":216691688.0, pointer: 3,
"pointer":2, position: const Point(224.2857208251953, 519.4285888671875)
"x":241.7142791748047, ),
"y":440.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692425),
{ pointer: 3,
"type":"pointermove", position: const Point(224.0, 523.4285888671875)
"timeStamp":216691696.0, ),
"pointer":2, const PointerMoveEvent(
"x":241.7142791748047, timeStamp: const Duration(milliseconds: 216692433),
"y":454.5714416503906 pointer: 3,
}, position: const Point(224.0, 527.1428833007812)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691703.0, timeStamp: const Duration(milliseconds: 216692441),
"pointer":2, pointer: 3,
"x":242.57142639160156, position: const Point(224.0, 530.5714111328125)
"y":467.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692448),
"type":"pointermove", pointer: 3,
"timeStamp":216691712.0, position: const Point(224.0, 533.1428833007812)
"pointer":2, ),
"x":243.42857360839844, const PointerMoveEvent(
"y":477.4285583496094 timeStamp: const Duration(milliseconds: 216692456),
}, pointer: 3,
{ position: const Point(224.0, 535.4285888671875)
"type":"pointermove", ),
"timeStamp":216691720.0, const PointerMoveEvent(
"pointer":2, timeStamp: const Duration(milliseconds: 216692464),
"x":244.85714721679688, pointer: 3,
"y":485.71429443359375 position: const Point(223.7142791748047, 536.8571166992188)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692472),
"timeStamp":216691727.0, pointer: 3,
"pointer":2, position: const Point(223.7142791748047, 538.2857055664062)
"x":246.2857208251953, ),
"y":493.1428527832031 const PointerUpEvent(
}, timeStamp: const Duration(milliseconds: 216692487),
{ pointer: 3,
"type":"pointermove", position: const Point(223.7142791748047, 538.2857055664062)
"timeStamp":216691735.0, ),
"pointer":2, const PointerDownEvent(
"x":248.0, timeStamp: const Duration(milliseconds: 216692678),
"y":499.71429443359375 pointer: 4,
}, position: const Point(221.42857360839844, 526.2857055664062)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216691750.0, timeStamp: const Duration(milliseconds: 216692701),
"pointer":2, pointer: 4,
"x":248.0, position: const Point(220.57142639160156, 514.8571166992188)
"y":499.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692708),
"type":"pointerdown", pointer: 4,
"timeStamp":216692255.0, position: const Point(220.2857208251953, 508.0)
"pointer":3, ),
"x":249.42857360839844, const PointerMoveEvent(
"y":351.4285583496094 timeStamp: const Duration(milliseconds: 216692716),
}, pointer: 4,
{ position: const Point(220.2857208251953, 498.0)
"type":"pointermove", ),
"timeStamp":216692270.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216692724),
"x":249.42857360839844, pointer: 4,
"y":351.4285583496094 position: const Point(221.14285278320312, 484.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692732),
"timeStamp":216692309.0, pointer: 4,
"pointer":3, position: const Point(221.7142791748047, 469.4285583496094)
"x":246.2857208251953, ),
"y":361.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692740),
{ pointer: 4,
"type":"pointermove", position: const Point(223.42857360839844, 453.1428527832031)
"timeStamp":216692317.0, ),
"pointer":3, const PointerMoveEvent(
"x":244.0, timeStamp: const Duration(milliseconds: 216692748),
"y":368.5714416503906 pointer: 4,
}, position: const Point(225.7142791748047, 436.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692325.0, timeStamp: const Duration(milliseconds: 216692755),
"pointer":3, pointer: 4,
"x":241.42857360839844, position: const Point(229.14285278320312, 418.28570556640625)
"y":377.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692763),
"type":"pointermove", pointer: 4,
"timeStamp":216692333.0, position: const Point(232.85714721679688, 400.28570556640625)
"pointer":3, ),
"x":237.7142791748047, const PointerMoveEvent(
"y":391.71429443359375 timeStamp: const Duration(milliseconds: 216692770),
}, pointer: 4,
{ position: const Point(236.85714721679688, 382.5714416503906)
"type":"pointermove", ),
"timeStamp":216692340.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216692778),
"x":235.14285278320312, pointer: 4,
"y":406.5714416503906 position: const Point(241.14285278320312, 366.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692786),
"timeStamp":216692348.0, pointer: 4,
"pointer":3, position: const Point(244.85714721679688, 350.28570556640625)
"x":232.57142639160156, ),
"y":421.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692793),
{ pointer: 4,
"type":"pointermove", position: const Point(249.14285278320312, 335.4285583496094)
"timeStamp":216692356.0, ),
"pointer":3, const PointerUpEvent(
"x":230.2857208251953, timeStamp: const Duration(milliseconds: 216692809),
"y":436.5714416503906 pointer: 4,
}, position: const Point(249.14285278320312, 335.4285583496094)
{ ),
"type":"pointermove", const PointerDownEvent(
"timeStamp":216692363.0, timeStamp: const Duration(milliseconds: 216693222),
"pointer":3, pointer: 5,
"x":228.2857208251953, position: const Point(224.0, 545.4285888671875)
"y":451.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216693245),
"type":"pointermove", pointer: 5,
"timeStamp":216692371.0, position: const Point(224.0, 545.4285888671875)
"pointer":3, ),
"x":227.42857360839844, const PointerMoveEvent(
"y":466.0 timeStamp: const Duration(milliseconds: 216693275),
}, pointer: 5,
{ position: const Point(222.85714721679688, 535.1428833007812)
"type":"pointermove", ),
"timeStamp":216692378.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216693284),
"x":226.2857208251953, pointer: 5,
"y":479.71429443359375 position: const Point(222.85714721679688, 528.8571166992188)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216693291),
"timeStamp":216692387.0, pointer: 5,
"pointer":3, position: const Point(222.2857208251953, 518.5714111328125)
"x":225.7142791748047, ),
"y":491.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216693299),
{ pointer: 5,
"type":"pointermove", position: const Point(222.0, 503.4285583496094)
"timeStamp":216692395.0, ),
"pointer":3, const PointerMoveEvent(
"x":225.14285278320312, timeStamp: const Duration(milliseconds: 216693307),
"y":501.71429443359375 pointer: 5,
}, position: const Point(222.0, 485.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692402.0, timeStamp: const Duration(milliseconds: 216693314),
"pointer":3, pointer: 5,
"x":224.85714721679688, position: const Point(221.7142791748047, 464.0)
"y":509.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216693322),
"type":"pointermove", pointer: 5,
"timeStamp":216692410.0, position: const Point(222.2857208251953, 440.28570556640625)
"pointer":3, ),
"x":224.57142639160156, const PointerUpEvent(
"y":514.8571166992188 timeStamp: const Duration(milliseconds: 216693337),
}, pointer: 5,
{ position: const Point(222.2857208251953, 440.28570556640625)
"type":"pointermove", ),
"timeStamp":216692418.0, const PointerDownEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216693985),
"x":224.2857208251953, pointer: 6,
"y":519.4285888671875 position: const Point(208.0, 544.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694047),
"timeStamp":216692425.0, pointer: 6,
"pointer":3, position: const Point(208.57142639160156, 532.2857055664062)
"x":224.0, ),
"y":523.4285888671875 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694054),
{ pointer: 6,
"type":"pointermove", position: const Point(208.85714721679688, 525.7142944335938)
"timeStamp":216692433.0, ),
"pointer":3, const PointerMoveEvent(
"x":224.0, timeStamp: const Duration(milliseconds: 216694062),
"y":527.1428833007812 pointer: 6,
}, position: const Point(208.85714721679688, 515.1428833007812)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692441.0, timeStamp: const Duration(milliseconds: 216694070),
"pointer":3, pointer: 6,
"x":224.0, position: const Point(208.0, 501.4285583496094)
"y":530.5714111328125 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694077),
"type":"pointermove", pointer: 6,
"timeStamp":216692448.0, position: const Point(207.42857360839844, 487.1428527832031)
"pointer":3, ),
"x":224.0, const PointerMoveEvent(
"y":533.1428833007812 timeStamp: const Duration(milliseconds: 216694085),
}, pointer: 6,
{ position: const Point(206.57142639160156, 472.8571472167969)
"type":"pointermove", ),
"timeStamp":216692456.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216694092),
"x":224.0, pointer: 6,
"y":535.4285888671875 position: const Point(206.57142639160156, 458.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694100),
"timeStamp":216692464.0, pointer: 6,
"pointer":3, position: const Point(206.57142639160156, 446.0)
"x":223.7142791748047, ),
"y":536.8571166992188 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694108),
{ pointer: 6,
"type":"pointermove", position: const Point(206.57142639160156, 434.28570556640625)
"timeStamp":216692472.0, ),
"pointer":3, const PointerMoveEvent(
"x":223.7142791748047, timeStamp: const Duration(milliseconds: 216694116),
"y":538.2857055664062 pointer: 6,
}, position: const Point(207.14285278320312, 423.71429443359375)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216692487.0, timeStamp: const Duration(milliseconds: 216694124),
"pointer":3, pointer: 6,
"x":223.7142791748047, position: const Point(208.57142639160156, 412.8571472167969)
"y":538.2857055664062 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694131),
"type":"pointerdown", pointer: 6,
"timeStamp":216692678.0, position: const Point(209.7142791748047, 402.28570556640625)
"pointer":4, ),
"x":221.42857360839844, const PointerMoveEvent(
"y":526.2857055664062 timeStamp: const Duration(milliseconds: 216694139),
}, pointer: 6,
{ position: const Point(211.7142791748047, 393.1428527832031)
"type":"pointermove", ),
"timeStamp":216692701.0, const PointerMoveEvent(
"pointer":4, timeStamp: const Duration(milliseconds: 216694147),
"x":220.57142639160156, pointer: 6,
"y":514.8571166992188 position: const Point(213.42857360839844, 385.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694154),
"timeStamp":216692708.0, pointer: 6,
"pointer":4, position: const Point(215.42857360839844, 378.28570556640625)
"x":220.2857208251953, ),
"y":508.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694162),
{ pointer: 6,
"type":"pointermove", position: const Point(217.42857360839844, 371.71429443359375)
"timeStamp":216692716.0, ),
"pointer":4, const PointerMoveEvent(
"x":220.2857208251953, timeStamp: const Duration(milliseconds: 216694169),
"y":498.0 pointer: 6,
}, position: const Point(219.42857360839844, 366.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692724.0, timeStamp: const Duration(milliseconds: 216694177),
"pointer":4, pointer: 6,
"x":221.14285278320312, position: const Point(221.42857360839844, 360.8571472167969)
"y":484.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694185),
"type":"pointermove", pointer: 6,
"timeStamp":216692732.0, position: const Point(223.42857360839844, 356.5714416503906)
"pointer":4, ),
"x":221.7142791748047, const PointerMoveEvent(
"y":469.4285583496094 timeStamp: const Duration(milliseconds: 216694193),
}, pointer: 6,
{ position: const Point(225.14285278320312, 352.28570556640625)
"type":"pointermove", ),
"timeStamp":216692740.0, const PointerMoveEvent(
"pointer":4, timeStamp: const Duration(milliseconds: 216694201),
"x":223.42857360839844, pointer: 6,
"y":453.1428527832031 position: const Point(226.85714721679688, 348.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694209),
"timeStamp":216692748.0, pointer: 6,
"pointer":4, position: const Point(228.2857208251953, 346.0)
"x":225.7142791748047, ),
"y":436.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694216),
{ pointer: 6,
"type":"pointermove", position: const Point(229.14285278320312, 343.71429443359375)
"timeStamp":216692755.0, ),
"pointer":4, const PointerMoveEvent(
"x":229.14285278320312, timeStamp: const Duration(milliseconds: 216694224),
"y":418.28570556640625 pointer: 6,
}, position: const Point(230.0, 342.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692763.0, timeStamp: const Duration(milliseconds: 216694232),
"pointer":4, pointer: 6,
"x":232.85714721679688, position: const Point(230.57142639160156, 340.5714416503906)
"y":400.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694239),
"type":"pointermove", pointer: 6,
"timeStamp":216692770.0, position: const Point(230.85714721679688, 339.71429443359375)
"pointer":4, ),
"x":236.85714721679688, const PointerMoveEvent(
"y":382.5714416503906 timeStamp: const Duration(milliseconds: 216694247),
}, pointer: 6,
{ position: const Point(230.85714721679688, 339.4285583496094)
"type":"pointermove", ),
"timeStamp":216692778.0, const PointerMoveEvent(
"pointer":4, timeStamp: const Duration(milliseconds: 216694262),
"x":241.14285278320312, pointer: 6,
"y":366.0 position: const Point(230.2857208251953, 342.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694270),
"timeStamp":216692786.0, pointer: 6,
"pointer":4, position: const Point(228.85714721679688, 346.28570556640625)
"x":244.85714721679688, ),
"y":350.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694278),
{ pointer: 6,
"type":"pointermove", position: const Point(227.14285278320312, 352.5714416503906)
"timeStamp":216692793.0, ),
"pointer":4, const PointerMoveEvent(
"x":249.14285278320312, timeStamp: const Duration(milliseconds: 216694286),
"y":335.4285583496094 pointer: 6,
}, position: const Point(225.42857360839844, 359.4285583496094)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216692809.0, timeStamp: const Duration(milliseconds: 216694294),
"pointer":4, pointer: 6,
"x":249.14285278320312, position: const Point(223.7142791748047, 367.71429443359375)
"y":335.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694301),
"type":"pointerdown", pointer: 6,
"timeStamp":216693222.0, position: const Point(222.57142639160156, 376.0)
"pointer":5, ),
"x":224.0, const PointerMoveEvent(
"y":545.4285888671875 timeStamp: const Duration(milliseconds: 216694309),
}, pointer: 6,
{ position: const Point(221.42857360839844, 384.28570556640625)
"type":"pointermove", ),
"timeStamp":216693245.0, const PointerMoveEvent(
"pointer":5, timeStamp: const Duration(milliseconds: 216694317),
"x":224.0, pointer: 6,
"y":545.4285888671875 position: const Point(220.85714721679688, 392.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694324),
"timeStamp":216693275.0, pointer: 6,
"pointer":5, position: const Point(220.0, 400.5714416503906)
"x":222.85714721679688, ),
"y":535.1428833007812 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694332),
{ pointer: 6,
"type":"pointermove", position: const Point(219.14285278320312, 409.71429443359375)
"timeStamp":216693284.0, ),
"pointer":5, const PointerMoveEvent(
"x":222.85714721679688, timeStamp: const Duration(milliseconds: 216694339),
"y":528.8571166992188 pointer: 6,
}, position: const Point(218.85714721679688, 419.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216693291.0, timeStamp: const Duration(milliseconds: 216694348),
"pointer":5, pointer: 6,
"x":222.2857208251953, position: const Point(218.2857208251953, 428.8571472167969)
"y":518.5714111328125 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694356),
"type":"pointermove", pointer: 6,
"timeStamp":216693299.0, position: const Point(218.2857208251953, 438.8571472167969)
"pointer":5, ),
"x":222.0, const PointerMoveEvent(
"y":503.4285583496094 timeStamp: const Duration(milliseconds: 216694363),
}, pointer: 6,
{ position: const Point(218.2857208251953, 447.71429443359375)
"type":"pointermove", ),
"timeStamp":216693307.0, const PointerMoveEvent(
"pointer":5, timeStamp: const Duration(milliseconds: 216694371),
"x":222.0, pointer: 6,
"y":485.4285583496094 position: const Point(218.2857208251953, 455.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694379),
"timeStamp":216693314.0, pointer: 6,
"pointer":5, position: const Point(219.14285278320312, 462.8571472167969)
"x":221.7142791748047, ),
"y":464.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694386),
{ pointer: 6,
"type":"pointermove", position: const Point(220.0, 469.4285583496094)
"timeStamp":216693322.0, ),
"pointer":5, const PointerMoveEvent(
"x":222.2857208251953, timeStamp: const Duration(milliseconds: 216694394),
"y":440.28570556640625 pointer: 6,
}, position: const Point(221.14285278320312, 475.4285583496094)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216693337.0, timeStamp: const Duration(milliseconds: 216694401),
"pointer":5, pointer: 6,
"x":222.2857208251953, position: const Point(222.0, 480.5714416503906)
"y":440.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694409),
"type":"pointerdown", pointer: 6,
"timeStamp":216693985.0, position: const Point(222.85714721679688, 485.4285583496094)
"pointer":6, ),
"x":208.0, const PointerMoveEvent(
"y":544.0 timeStamp: const Duration(milliseconds: 216694417),
}, pointer: 6,
{ position: const Point(224.0, 489.71429443359375)
"type":"pointermove", ),
"timeStamp":216694047.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694425),
"x":208.57142639160156, pointer: 6,
"y":532.2857055664062 position: const Point(224.85714721679688, 492.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694433),
"timeStamp":216694054.0, pointer: 6,
"pointer":6, position: const Point(225.42857360839844, 495.4285583496094)
"x":208.85714721679688, ),
"y":525.7142944335938 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694440),
{ pointer: 6,
"type":"pointermove", position: const Point(226.0, 497.1428527832031)
"timeStamp":216694062.0, ),
"pointer":6, const PointerMoveEvent(
"x":208.85714721679688, timeStamp: const Duration(milliseconds: 216694448),
"y":515.1428833007812 pointer: 6,
}, position: const Point(226.2857208251953, 498.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694070.0, timeStamp: const Duration(milliseconds: 216694456),
"pointer":6, pointer: 6,
"x":208.0, position: const Point(226.2857208251953, 498.8571472167969)
"y":501.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694471),
"type":"pointermove", pointer: 6,
"timeStamp":216694077.0, position: const Point(226.2857208251953, 498.28570556640625)
"pointer":6, ),
"x":207.42857360839844, const PointerMoveEvent(
"y":487.1428527832031 timeStamp: const Duration(milliseconds: 216694479),
}, pointer: 6,
{ position: const Point(226.2857208251953, 496.5714416503906)
"type":"pointermove", ),
"timeStamp":216694085.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694486),
"x":206.57142639160156, pointer: 6,
"y":472.8571472167969 position: const Point(226.2857208251953, 493.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694494),
"timeStamp":216694092.0, pointer: 6,
"pointer":6, position: const Point(226.2857208251953, 490.0)
"x":206.57142639160156, ),
"y":458.8571472167969 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694502),
{ pointer: 6,
"type":"pointermove", position: const Point(226.2857208251953, 486.0)
"timeStamp":216694100.0, ),
"pointer":6, const PointerMoveEvent(
"x":206.57142639160156, timeStamp: const Duration(milliseconds: 216694510),
"y":446.0 pointer: 6,
}, position: const Point(226.2857208251953, 480.5714416503906)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694108.0, timeStamp: const Duration(milliseconds: 216694518),
"pointer":6, pointer: 6,
"x":206.57142639160156, position: const Point(226.2857208251953, 475.71429443359375)
"y":434.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694525),
"type":"pointermove", pointer: 6,
"timeStamp":216694116.0, position: const Point(226.2857208251953, 468.8571472167969)
"pointer":6, ),
"x":207.14285278320312, const PointerMoveEvent(
"y":423.71429443359375 timeStamp: const Duration(milliseconds: 216694533),
}, pointer: 6,
{ position: const Point(226.2857208251953, 461.4285583496094)
"type":"pointermove", ),
"timeStamp":216694124.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694541),
"x":208.57142639160156, pointer: 6,
"y":412.8571472167969 position: const Point(226.2857208251953, 452.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694548),
"timeStamp":216694131.0, pointer: 6,
"pointer":6, position: const Point(226.57142639160156, 442.28570556640625)
"x":209.7142791748047, ),
"y":402.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694556),
{ pointer: 6,
"type":"pointermove", position: const Point(226.57142639160156, 432.28570556640625)
"timeStamp":216694139.0, ),
"pointer":6, const PointerMoveEvent(
"x":211.7142791748047, timeStamp: const Duration(milliseconds: 216694564),
"y":393.1428527832031 pointer: 6,
}, position: const Point(226.85714721679688, 423.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694147.0, timeStamp: const Duration(milliseconds: 216694571),
"pointer":6, pointer: 6,
"x":213.42857360839844, position: const Point(227.42857360839844, 416.0)
"y":385.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694580),
"type":"pointermove", pointer: 6,
"timeStamp":216694154.0, position: const Point(227.7142791748047, 410.0)
"pointer":6, ),
"x":215.42857360839844, const PointerMoveEvent(
"y":378.28570556640625 timeStamp: const Duration(milliseconds: 216694587),
}, pointer: 6,
{ position: const Point(228.2857208251953, 404.28570556640625)
"type":"pointermove", ),
"timeStamp":216694162.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694595),
"x":217.42857360839844, pointer: 6,
"y":371.71429443359375 position: const Point(228.85714721679688, 399.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694603),
"timeStamp":216694169.0, pointer: 6,
"pointer":6, position: const Point(229.14285278320312, 395.4285583496094)
"x":219.42857360839844, ),
"y":366.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694610),
{ pointer: 6,
"type":"pointermove", position: const Point(229.42857360839844, 392.28570556640625)
"timeStamp":216694177.0, ),
"pointer":6, const PointerMoveEvent(
"x":221.42857360839844, timeStamp: const Duration(milliseconds: 216694618),
"y":360.8571472167969 pointer: 6,
}, position: const Point(229.7142791748047, 390.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694185.0, timeStamp: const Duration(milliseconds: 216694625),
"pointer":6, pointer: 6,
"x":223.42857360839844, position: const Point(229.7142791748047, 388.0)
"y":356.5714416503906 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694633),
"type":"pointermove", pointer: 6,
"timeStamp":216694193.0, position: const Point(229.7142791748047, 386.8571472167969)
"pointer":6, ),
"x":225.14285278320312, const PointerMoveEvent(
"y":352.28570556640625 timeStamp: const Duration(milliseconds: 216694641),
}, pointer: 6,
{ position: const Point(229.7142791748047, 386.28570556640625)
"type":"pointermove", ),
"timeStamp":216694201.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694648),
"x":226.85714721679688, pointer: 6,
"y":348.5714416503906 position: const Point(229.7142791748047, 386.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694657),
"timeStamp":216694209.0, pointer: 6,
"pointer":6, position: const Point(228.85714721679688, 386.0)
"x":228.2857208251953, ),
"y":346.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694665),
{ pointer: 6,
"type":"pointermove", position: const Point(228.0, 388.0)
"timeStamp":216694216.0, ),
"pointer":6, const PointerMoveEvent(
"x":229.14285278320312, timeStamp: const Duration(milliseconds: 216694672),
"y":343.71429443359375 pointer: 6,
}, position: const Point(226.0, 392.5714416503906)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694224.0, timeStamp: const Duration(milliseconds: 216694680),
"pointer":6, pointer: 6,
"x":230.0, position: const Point(224.0, 397.71429443359375)
"y":342.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694688),
"type":"pointermove", pointer: 6,
"timeStamp":216694232.0, position: const Point(222.0, 404.28570556640625)
"pointer":6, ),
"x":230.57142639160156, const PointerMoveEvent(
"y":340.5714416503906 timeStamp: const Duration(milliseconds: 216694695),
}, pointer: 6,
{ position: const Point(219.7142791748047, 411.1428527832031)
"type":"pointermove", ),
"timeStamp":216694239.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694703),
"x":230.85714721679688, pointer: 6,
"y":339.71429443359375 position: const Point(218.2857208251953, 418.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694710),
"timeStamp":216694247.0, pointer: 6,
"pointer":6, position: const Point(217.14285278320312, 425.4285583496094)
"x":230.85714721679688, ),
"y":339.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694718),
{ pointer: 6,
"type":"pointermove", position: const Point(215.7142791748047, 433.4285583496094)
"timeStamp":216694262.0, ),
"pointer":6, const PointerMoveEvent(
"x":230.2857208251953, timeStamp: const Duration(milliseconds: 216694726),
"y":342.0 pointer: 6,
}, position: const Point(214.85714721679688, 442.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694270.0, timeStamp: const Duration(milliseconds: 216694734),
"pointer":6, pointer: 6,
"x":228.85714721679688, position: const Point(214.0, 454.0)
"y":346.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694742),
"type":"pointermove", pointer: 6,
"timeStamp":216694278.0, position: const Point(214.0, 469.4285583496094)
"pointer":6, ),
"x":227.14285278320312, const PointerMoveEvent(
"y":352.5714416503906 timeStamp: const Duration(milliseconds: 216694749),
}, pointer: 6,
{ position: const Point(215.42857360839844, 485.4285583496094)
"type":"pointermove", ),
"timeStamp":216694286.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694757),
"x":225.42857360839844, pointer: 6,
"y":359.4285583496094 position: const Point(217.7142791748047, 502.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694765),
"timeStamp":216694294.0, pointer: 6,
"pointer":6, position: const Point(221.14285278320312, 521.4285888671875)
"x":223.7142791748047, ),
"y":367.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694772),
{ pointer: 6,
"type":"pointermove", position: const Point(224.57142639160156, 541.1428833007812)
"timeStamp":216694301.0, ),
"pointer":6, const PointerMoveEvent(
"x":222.57142639160156, timeStamp: const Duration(milliseconds: 216694780),
"y":376.0 pointer: 6,
}, position: const Point(229.14285278320312, 561.1428833007812)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694309.0, timeStamp: const Duration(milliseconds: 216694788),
"pointer":6, pointer: 6,
"x":221.42857360839844, position: const Point(233.42857360839844, 578.8571166992188)
"y":384.28570556640625 ),
}, const PointerUpEvent(
{ timeStamp: const Duration(milliseconds: 216694802),
"type":"pointermove", pointer: 6,
"timeStamp":216694317.0, position: const Point(233.42857360839844, 578.8571166992188)
"pointer":6, ),
"x":220.85714721679688, const PointerDownEvent(
"y":392.28570556640625 timeStamp: const Duration(milliseconds: 216695344),
}, pointer: 7,
{ position: const Point(253.42857360839844, 310.5714416503906)
"type":"pointermove", ),
"timeStamp":216694324.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695352),
"x":220.0, pointer: 7,
"y":400.5714416503906 position: const Point(253.42857360839844, 310.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695359),
"timeStamp":216694332.0, pointer: 7,
"pointer":6, position: const Point(252.85714721679688, 318.0)
"x":219.14285278320312, ),
"y":409.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695367),
{ pointer: 7,
"type":"pointermove", position: const Point(251.14285278320312, 322.0)
"timeStamp":216694339.0, ),
"pointer":6, const PointerMoveEvent(
"x":218.85714721679688, timeStamp: const Duration(milliseconds: 216695375),
"y":419.1428527832031 pointer: 7,
}, position: const Point(248.85714721679688, 327.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694348.0, timeStamp: const Duration(milliseconds: 216695382),
"pointer":6, pointer: 7,
"x":218.2857208251953, position: const Point(246.0, 334.8571472167969)
"y":428.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695390),
"type":"pointermove", pointer: 7,
"timeStamp":216694356.0, position: const Point(242.57142639160156, 344.5714416503906)
"pointer":6, ),
"x":218.2857208251953, const PointerMoveEvent(
"y":438.8571472167969 timeStamp: const Duration(milliseconds: 216695397),
}, pointer: 7,
{ position: const Point(238.85714721679688, 357.4285583496094)
"type":"pointermove", ),
"timeStamp":216694363.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695406),
"x":218.2857208251953, pointer: 7,
"y":447.71429443359375 position: const Point(235.7142791748047, 371.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695414),
"timeStamp":216694371.0, pointer: 7,
"pointer":6, position: const Point(232.2857208251953, 386.8571472167969)
"x":218.2857208251953, ),
"y":455.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695421),
{ pointer: 7,
"type":"pointermove", position: const Point(229.42857360839844, 402.0)
"timeStamp":216694379.0, ),
"pointer":6, const PointerMoveEvent(
"x":219.14285278320312, timeStamp: const Duration(milliseconds: 216695429),
"y":462.8571472167969 pointer: 7,
}, position: const Point(227.42857360839844, 416.8571472167969)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694386.0, timeStamp: const Duration(milliseconds: 216695437),
"pointer":6, pointer: 7,
"x":220.0, position: const Point(226.2857208251953, 431.4285583496094)
"y":469.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695444),
"type":"pointermove", pointer: 7,
"timeStamp":216694394.0, position: const Point(226.2857208251953, 446.0)
"pointer":6, ),
"x":221.14285278320312, const PointerMoveEvent(
"y":475.4285583496094 timeStamp: const Duration(milliseconds: 216695452),
}, pointer: 7,
{ position: const Point(227.7142791748047, 460.28570556640625)
"type":"pointermove", ),
"timeStamp":216694401.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695459),
"x":222.0, pointer: 7,
"y":480.5714416503906 position: const Point(230.0, 475.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695467),
"timeStamp":216694409.0, pointer: 7,
"pointer":6, position: const Point(232.2857208251953, 489.71429443359375)
"x":222.85714721679688, ),
"y":485.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695475),
{ pointer: 7,
"type":"pointermove", position: const Point(235.7142791748047, 504.0)
"timeStamp":216694417.0, ),
"pointer":6, const PointerUpEvent(
"x":224.0, timeStamp: const Duration(milliseconds: 216695490),
"y":489.71429443359375 pointer: 7,
}, position: const Point(235.7142791748047, 504.0)
{ ),
"type":"pointermove", const PointerDownEvent(
"timeStamp":216694425.0, timeStamp: const Duration(milliseconds: 216695885),
"pointer":6, pointer: 8,
"x":224.85714721679688, position: const Point(238.85714721679688, 524.0)
"y":492.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695908),
"type":"pointermove", pointer: 8,
"timeStamp":216694433.0, position: const Point(236.2857208251953, 515.7142944335938)
"pointer":6, ),
"x":225.42857360839844, const PointerMoveEvent(
"y":495.4285583496094 timeStamp: const Duration(milliseconds: 216695916),
}, pointer: 8,
{ position: const Point(234.85714721679688, 509.1428527832031)
"type":"pointermove", ),
"timeStamp":216694440.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695924),
"x":226.0, pointer: 8,
"y":497.1428527832031 position: const Point(232.57142639160156, 498.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695931),
"timeStamp":216694448.0, pointer: 8,
"pointer":6, position: const Point(230.57142639160156, 483.71429443359375)
"x":226.2857208251953, ),
"y":498.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695939),
{ pointer: 8,
"type":"pointermove", position: const Point(229.14285278320312, 466.5714416503906)
"timeStamp":216694456.0, ),
"pointer":6, const PointerMoveEvent(
"x":226.2857208251953, timeStamp: const Duration(milliseconds: 216695947),
"y":498.8571472167969 pointer: 8,
}, position: const Point(229.14285278320312, 446.5714416503906)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694471.0, timeStamp: const Duration(milliseconds: 216695955),
"pointer":6, pointer: 8,
"x":226.2857208251953, position: const Point(230.57142639160156, 424.8571472167969)
"y":498.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695963),
"type":"pointermove", pointer: 8,
"timeStamp":216694479.0, position: const Point(232.57142639160156, 402.28570556640625)
"pointer":6, ),
"x":226.2857208251953, const PointerMoveEvent(
"y":496.5714416503906 timeStamp: const Duration(milliseconds: 216695970),
}, pointer: 8,
{ position: const Point(235.14285278320312, 380.0)
"type":"pointermove", ),
"timeStamp":216694486.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695978),
"x":226.2857208251953, pointer: 8,
"y":493.71429443359375 position: const Point(238.57142639160156, 359.4285583496094)
}, ),
{ const PointerUpEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695993),
"timeStamp":216694494.0, pointer: 8,
"pointer":6, position: const Point(238.57142639160156, 359.4285583496094)
"x":226.2857208251953, ),
"y":490.0 const PointerDownEvent(
}, timeStamp: const Duration(milliseconds: 216696429),
{ pointer: 9,
"type":"pointermove", position: const Point(238.2857208251953, 568.5714111328125)
"timeStamp":216694502.0, ),
"pointer":6, const PointerMoveEvent(
"x":226.2857208251953, timeStamp: const Duration(milliseconds: 216696459),
"y":486.0 pointer: 9,
}, position: const Point(234.0, 560.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694510.0, timeStamp: const Duration(milliseconds: 216696467),
"pointer":6, pointer: 9,
"x":226.2857208251953, position: const Point(231.42857360839844, 553.1428833007812)
"y":480.5714416503906 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216696475),
"type":"pointermove", pointer: 9,
"timeStamp":216694518.0, position: const Point(228.2857208251953, 543.1428833007812)
"pointer":6, ),
"x":226.2857208251953, const PointerMoveEvent(
"y":475.71429443359375 timeStamp: const Duration(milliseconds: 216696483),
}, pointer: 9,
{ position: const Point(225.42857360839844, 528.8571166992188)
"type":"pointermove", ),
"timeStamp":216694525.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216696491),
"x":226.2857208251953, pointer: 9,
"y":468.8571472167969 position: const Point(223.14285278320312, 512.2857055664062)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216696498),
"timeStamp":216694533.0, pointer: 9,
"pointer":6, position: const Point(222.0, 495.4285583496094)
"x":226.2857208251953, ),
"y":461.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216696506),
{ pointer: 9,
"type":"pointermove", position: const Point(221.7142791748047, 477.4285583496094)
"timeStamp":216694541.0, ),
"pointer":6, const PointerMoveEvent(
"x":226.2857208251953, timeStamp: const Duration(milliseconds: 216696514),
"y":452.5714416503906 pointer: 9,
}, position: const Point(221.7142791748047, 458.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694548.0, timeStamp: const Duration(milliseconds: 216696521),
"pointer":6, pointer: 9,
"x":226.57142639160156, position: const Point(223.14285278320312, 438.0)
"y":442.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216696529),
"type":"pointermove", pointer: 9,
"timeStamp":216694556.0, position: const Point(224.2857208251953, 416.28570556640625)
"pointer":6, ),
"x":226.57142639160156, const PointerUpEvent(
"y":432.28570556640625 timeStamp: const Duration(milliseconds: 216696544),
}, pointer: 9,
{ position: const Point(224.2857208251953, 416.28570556640625)
"type":"pointermove", ),
"timeStamp":216694564.0, const PointerDownEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216696974),
"x":226.85714721679688, pointer: 10,
"y":423.4285583496094 position: const Point(218.57142639160156, 530.5714111328125)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697012),
"timeStamp":216694571.0, pointer: 10,
"pointer":6, position: const Point(220.2857208251953, 522.0)
"x":227.42857360839844, ),
"y":416.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216697020),
{ pointer: 10,
"type":"pointermove", position: const Point(221.14285278320312, 517.7142944335938)
"timeStamp":216694580.0, ),
"pointer":6, const PointerMoveEvent(
"x":227.7142791748047, timeStamp: const Duration(milliseconds: 216697028),
"y":410.0 pointer: 10,
}, position: const Point(222.2857208251953, 511.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694587.0, timeStamp: const Duration(milliseconds: 216697036),
"pointer":6, pointer: 10,
"x":228.2857208251953, position: const Point(224.0, 504.28570556640625)
"y":404.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697044),
"type":"pointermove", pointer: 10,
"timeStamp":216694595.0, position: const Point(227.14285278320312, 490.5714416503906)
"pointer":6, ),
"x":228.85714721679688, const PointerMoveEvent(
"y":399.71429443359375 timeStamp: const Duration(milliseconds: 216697052),
}, pointer: 10,
{ position: const Point(229.42857360839844, 474.0)
"type":"pointermove", ),
"timeStamp":216694603.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697059),
"x":229.14285278320312, pointer: 10,
"y":395.4285583496094 position: const Point(231.42857360839844, 454.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697067),
"timeStamp":216694610.0, pointer: 10,
"pointer":6, position: const Point(233.7142791748047, 431.1428527832031)
"x":229.42857360839844, ),
"y":392.28570556640625 const PointerUpEvent(
}, timeStamp: const Duration(milliseconds: 216697082),
{ pointer: 10,
"type":"pointermove", position: const Point(233.7142791748047, 431.1428527832031)
"timeStamp":216694618.0, ),
"pointer":6, const PointerDownEvent(
"x":229.7142791748047, timeStamp: const Duration(milliseconds: 216697435),
"y":390.0 pointer: 11,
}, position: const Point(257.1428527832031, 285.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694625.0, timeStamp: const Duration(milliseconds: 216697465),
"pointer":6, pointer: 11,
"x":229.7142791748047, position: const Point(251.7142791748047, 296.8571472167969)
"y":388.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697473),
"type":"pointermove", pointer: 11,
"timeStamp":216694633.0, position: const Point(248.2857208251953, 304.0)
"pointer":6, ),
"x":229.7142791748047, const PointerMoveEvent(
"y":386.8571472167969 timeStamp: const Duration(milliseconds: 216697481),
}, pointer: 11,
{ position: const Point(244.57142639160156, 314.8571472167969)
"type":"pointermove", ),
"timeStamp":216694641.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697489),
"x":229.7142791748047, pointer: 11,
"y":386.28570556640625 position: const Point(240.2857208251953, 329.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697497),
"timeStamp":216694648.0, pointer: 11,
"pointer":6, position: const Point(236.85714721679688, 345.1428527832031)
"x":229.7142791748047, ),
"y":386.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216697505),
{ pointer: 11,
"type":"pointermove", position: const Point(233.7142791748047, 361.4285583496094)
"timeStamp":216694657.0, ),
"pointer":6, const PointerMoveEvent(
"x":228.85714721679688, timeStamp: const Duration(milliseconds: 216697512),
"y":386.0 pointer: 11,
}, position: const Point(231.14285278320312, 378.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694665.0, timeStamp: const Duration(milliseconds: 216697520),
"pointer":6, pointer: 11,
"x":228.0, position: const Point(229.42857360839844, 395.4285583496094)
"y":388.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697528),
"type":"pointermove", pointer: 11,
"timeStamp":216694672.0, position: const Point(229.42857360839844, 412.8571472167969)
"pointer":6, ),
"x":226.0, const PointerMoveEvent(
"y":392.5714416503906 timeStamp: const Duration(milliseconds: 216697535),
}, pointer: 11,
{ position: const Point(230.85714721679688, 430.8571472167969)
"type":"pointermove", ),
"timeStamp":216694680.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697543),
"x":224.0, pointer: 11,
"y":397.71429443359375 position: const Point(233.42857360839844, 449.71429443359375)
}, ),
{ const PointerUpEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697558),
"timeStamp":216694688.0, pointer: 11,
"pointer":6, position: const Point(233.42857360839844, 449.71429443359375)
"x":222.0, ),
"y":404.28570556640625 const PointerDownEvent(
}, timeStamp: const Duration(milliseconds: 216697749),
{ pointer: 12,
"type":"pointermove", position: const Point(246.0, 311.4285583496094)
"timeStamp":216694695.0, ),
"pointer":6, const PointerMoveEvent(
"x":219.7142791748047, timeStamp: const Duration(milliseconds: 216697780),
"y":411.1428527832031 pointer: 12,
}, position: const Point(244.57142639160156, 318.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694703.0, timeStamp: const Duration(milliseconds: 216697787),
"pointer":6, pointer: 12,
"x":218.2857208251953, position: const Point(243.14285278320312, 325.4285583496094)
"y":418.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697795),
"type":"pointermove", pointer: 12,
"timeStamp":216694710.0, position: const Point(241.42857360839844, 336.0)
"pointer":6, ),
"x":217.14285278320312, const PointerMoveEvent(
"y":425.4285583496094 timeStamp: const Duration(milliseconds: 216697803),
}, pointer: 12,
{ position: const Point(239.7142791748047, 351.1428527832031)
"type":"pointermove", ),
"timeStamp":216694718.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697811),
"x":215.7142791748047, pointer: 12,
"y":433.4285583496094 position: const Point(238.2857208251953, 368.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697819),
"timeStamp":216694726.0, pointer: 12,
"pointer":6, position: const Point(238.0, 389.4285583496094)
"x":214.85714721679688, ),
"y":442.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216697826),
{ pointer: 12,
"type":"pointermove", position: const Point(239.14285278320312, 412.0)
"timeStamp":216694734.0, ),
"pointer":6, const PointerMoveEvent(
"x":214.0, timeStamp: const Duration(milliseconds: 216697834),
"y":454.0 pointer: 12,
}, position: const Point(242.2857208251953, 438.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694742.0, timeStamp: const Duration(milliseconds: 216697842),
"pointer":6, pointer: 12,
"x":214.0, position: const Point(247.42857360839844, 466.8571472167969)
"y":469.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697849),
"type":"pointermove", pointer: 12,
"timeStamp":216694749.0, position: const Point(254.2857208251953, 497.71429443359375)
"pointer":6, ),
"x":215.42857360839844, const PointerUpEvent(
"y":485.4285583496094 timeStamp: const Duration(milliseconds: 216697864),
}, pointer: 12,
{ position: const Point(254.2857208251953, 497.71429443359375)
"type":"pointermove", ),
"timeStamp":216694757.0, const PointerDownEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216698321),
"x":217.7142791748047, pointer: 13,
"y":502.8571472167969 position: const Point(250.0, 306.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216698328),
"timeStamp":216694765.0, pointer: 13,
"pointer":6, position: const Point(250.0, 306.0)
"x":221.14285278320312, ),
"y":521.4285888671875 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216698344),
{ pointer: 13,
"type":"pointermove", position: const Point(249.14285278320312, 314.0)
"timeStamp":216694772.0, ),
"pointer":6, const PointerMoveEvent(
"x":224.57142639160156, timeStamp: const Duration(milliseconds: 216698351),
"y":541.1428833007812 pointer: 13,
}, position: const Point(247.42857360839844, 319.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694780.0, timeStamp: const Duration(milliseconds: 216698359),
"pointer":6, pointer: 13,
"x":229.14285278320312, position: const Point(245.14285278320312, 326.8571472167969)
"y":561.1428833007812 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216698366),
"type":"pointermove", pointer: 13,
"timeStamp":216694788.0, position: const Point(241.7142791748047, 339.4285583496094)
"pointer":6, ),
"x":233.42857360839844, const PointerMoveEvent(
"y":578.8571166992188 timeStamp: const Duration(milliseconds: 216698374),
}, pointer: 13,
{ position: const Point(238.57142639160156, 355.71429443359375)
"type":"pointerup", ),
"timeStamp":216694802.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216698382),
"x":233.42857360839844, pointer: 13,
"y":578.8571166992188 position: const Point(236.2857208251953, 374.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointerdown", timeStamp: const Duration(milliseconds: 216698390),
"timeStamp":216695344.0, pointer: 13,
"pointer":7, position: const Point(235.14285278320312, 396.5714416503906)
"x":253.42857360839844, ),
"y":310.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216698398),
{ pointer: 13,
"type":"pointermove", position: const Point(236.57142639160156, 421.4285583496094)
"timeStamp":216695352.0, ),
"pointer":7, const PointerMoveEvent(
"x":253.42857360839844, timeStamp: const Duration(milliseconds: 216698406),
"y":310.5714416503906 pointer: 13,
}, position: const Point(241.14285278320312, 451.4285583496094)
{ ),
"type":"pointermove", const PointerUpEvent(
"timeStamp":216695359.0, timeStamp: const Duration(milliseconds: 216698421),
"pointer":7, pointer: 13,
"x":252.85714721679688, position: const Point(241.14285278320312, 451.4285583496094)
"y":318.0 ),
},
{
"type":"pointermove",
"timeStamp":216695367.0,
"pointer":7,
"x":251.14285278320312,
"y":322.0
},
{
"type":"pointermove",
"timeStamp":216695375.0,
"pointer":7,
"x":248.85714721679688,
"y":327.1428527832031
},
{
"type":"pointermove",
"timeStamp":216695382.0,
"pointer":7,
"x":246.0,
"y":334.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695390.0,
"pointer":7,
"x":242.57142639160156,
"y":344.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695397.0,
"pointer":7,
"x":238.85714721679688,
"y":357.4285583496094
},
{
"type":"pointermove",
"timeStamp":216695406.0,
"pointer":7,
"x":235.7142791748047,
"y":371.71429443359375
},
{
"type":"pointermove",
"timeStamp":216695414.0,
"pointer":7,
"x":232.2857208251953,
"y":386.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695421.0,
"pointer":7,
"x":229.42857360839844,
"y":402.0
},
{
"type":"pointermove",
"timeStamp":216695429.0,
"pointer":7,
"x":227.42857360839844,
"y":416.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695437.0,
"pointer":7,
"x":226.2857208251953,
"y":431.4285583496094
},
{
"type":"pointermove",
"timeStamp":216695444.0,
"pointer":7,
"x":226.2857208251953,
"y":446.0
},
{
"type":"pointermove",
"timeStamp":216695452.0,
"pointer":7,
"x":227.7142791748047,
"y":460.28570556640625
},
{
"type":"pointermove",
"timeStamp":216695459.0,
"pointer":7,
"x":230.0,
"y":475.1428527832031
},
{
"type":"pointermove",
"timeStamp":216695467.0,
"pointer":7,
"x":232.2857208251953,
"y":489.71429443359375
},
{
"type":"pointermove",
"timeStamp":216695475.0,
"pointer":7,
"x":235.7142791748047,
"y":504.0
},
{
"type":"pointerup",
"timeStamp":216695490.0,
"pointer":7,
"x":235.7142791748047,
"y":504.0
},
{
"type":"pointerdown",
"timeStamp":216695885.0,
"pointer":8,
"x":238.85714721679688,
"y":524.0
},
{
"type":"pointermove",
"timeStamp":216695908.0,
"pointer":8,
"x":236.2857208251953,
"y":515.7142944335938
},
{
"type":"pointermove",
"timeStamp":216695916.0,
"pointer":8,
"x":234.85714721679688,
"y":509.1428527832031
},
{
"type":"pointermove",
"timeStamp":216695924.0,
"pointer":8,
"x":232.57142639160156,
"y":498.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695931.0,
"pointer":8,
"x":230.57142639160156,
"y":483.71429443359375
},
{
"type":"pointermove",
"timeStamp":216695939.0,
"pointer":8,
"x":229.14285278320312,
"y":466.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695947.0,
"pointer":8,
"x":229.14285278320312,
"y":446.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695955.0,
"pointer":8,
"x":230.57142639160156,
"y":424.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695963.0,
"pointer":8,
"x":232.57142639160156,
"y":402.28570556640625
},
{
"type":"pointermove",
"timeStamp":216695970.0,
"pointer":8,
"x":235.14285278320312,
"y":380.0
},
{
"type":"pointermove",
"timeStamp":216695978.0,
"pointer":8,
"x":238.57142639160156,
"y":359.4285583496094
},
{
"type":"pointerup",
"timeStamp":216695993.0,
"pointer":8,
"x":238.57142639160156,
"y":359.4285583496094
},
{
"type":"pointerdown",
"timeStamp":216696429.0,
"pointer":9,
"x":238.2857208251953,
"y":568.5714111328125
},
{
"type":"pointermove",
"timeStamp":216696459.0,
"pointer":9,
"x":234.0,
"y":560.0
},
{
"type":"pointermove",
"timeStamp":216696467.0,
"pointer":9,
"x":231.42857360839844,
"y":553.1428833007812
},
{
"type":"pointermove",
"timeStamp":216696475.0,
"pointer":9,
"x":228.2857208251953,
"y":543.1428833007812
},
{
"type":"pointermove",
"timeStamp":216696483.0,
"pointer":9,
"x":225.42857360839844,
"y":528.8571166992188
},
{
"type":"pointermove",
"timeStamp":216696491.0,
"pointer":9,
"x":223.14285278320312,
"y":512.2857055664062
},
{
"type":"pointermove",
"timeStamp":216696498.0,
"pointer":9,
"x":222.0,
"y":495.4285583496094
},
{
"type":"pointermove",
"timeStamp":216696506.0,
"pointer":9,
"x":221.7142791748047,
"y":477.4285583496094
},
{
"type":"pointermove",
"timeStamp":216696514.0,
"pointer":9,
"x":221.7142791748047,
"y":458.28570556640625
},
{
"type":"pointermove",
"timeStamp":216696521.0,
"pointer":9,
"x":223.14285278320312,
"y":438.0
},
{
"type":"pointermove",
"timeStamp":216696529.0,
"pointer":9,
"x":224.2857208251953,
"y":416.28570556640625
},
{
"type":"pointerup",
"timeStamp":216696544.0,
"pointer":9,
"x":224.2857208251953,
"y":416.28570556640625
},
{
"type":"pointerdown",
"timeStamp":216696974.0,
"pointer":10,
"x":218.57142639160156,
"y":530.5714111328125
},
{
"type":"pointermove",
"timeStamp":216697012.0,
"pointer":10,
"x":220.2857208251953,
"y":522.0
},
{
"type":"pointermove",
"timeStamp":216697020.0,
"pointer":10,
"x":221.14285278320312,
"y":517.7142944335938
},
{
"type":"pointermove",
"timeStamp":216697028.0,
"pointer":10,
"x":222.2857208251953,
"y":511.71429443359375
},
{
"type":"pointermove",
"timeStamp":216697036.0,
"pointer":10,
"x":224.0,
"y":504.28570556640625
},
{
"type":"pointermove",
"timeStamp":216697044.0,
"pointer":10,
"x":227.14285278320312,
"y":490.5714416503906
},
{
"type":"pointermove",
"timeStamp":216697052.0,
"pointer":10,
"x":229.42857360839844,
"y":474.0
},
{
"type":"pointermove",
"timeStamp":216697059.0,
"pointer":10,
"x":231.42857360839844,
"y":454.5714416503906
},
{
"type":"pointermove",
"timeStamp":216697067.0,
"pointer":10,
"x":233.7142791748047,
"y":431.1428527832031
},
{
"type":"pointerup",
"timeStamp":216697082.0,
"pointer":10,
"x":233.7142791748047,
"y":431.1428527832031
},
{
"type":"pointerdown",
"timeStamp":216697435.0,
"pointer":11,
"x":257.1428527832031,
"y":285.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697465.0,
"pointer":11,
"x":251.7142791748047,
"y":296.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697473.0,
"pointer":11,
"x":248.2857208251953,
"y":304.0
},
{
"type":"pointermove",
"timeStamp":216697481.0,
"pointer":11,
"x":244.57142639160156,
"y":314.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697489.0,
"pointer":11,
"x":240.2857208251953,
"y":329.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697497.0,
"pointer":11,
"x":236.85714721679688,
"y":345.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697505.0,
"pointer":11,
"x":233.7142791748047,
"y":361.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697512.0,
"pointer":11,
"x":231.14285278320312,
"y":378.28570556640625
},
{
"type":"pointermove",
"timeStamp":216697520.0,
"pointer":11,
"x":229.42857360839844,
"y":395.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697528.0,
"pointer":11,
"x":229.42857360839844,
"y":412.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697535.0,
"pointer":11,
"x":230.85714721679688,
"y":430.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697543.0,
"pointer":11,
"x":233.42857360839844,
"y":449.71429443359375
},
{
"type":"pointerup",
"timeStamp":216697558.0,
"pointer":11,
"x":233.42857360839844,
"y":449.71429443359375
},
{
"type":"pointerdown",
"timeStamp":216697749.0,
"pointer":12,
"x":246.0,
"y":311.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697780.0,
"pointer":12,
"x":244.57142639160156,
"y":318.28570556640625
},
{
"type":"pointermove",
"timeStamp":216697787.0,
"pointer":12,
"x":243.14285278320312,
"y":325.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697795.0,
"pointer":12,
"x":241.42857360839844,
"y":336.0
},
{
"type":"pointermove",
"timeStamp":216697803.0,
"pointer":12,
"x":239.7142791748047,
"y":351.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697811.0,
"pointer":12,
"x":238.2857208251953,
"y":368.5714416503906
},
{
"type":"pointermove",
"timeStamp":216697819.0,
"pointer":12,
"x":238.0,
"y":389.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697826.0,
"pointer":12,
"x":239.14285278320312,
"y":412.0
},
{
"type":"pointermove",
"timeStamp":216697834.0,
"pointer":12,
"x":242.2857208251953,
"y":438.0
},
{
"type":"pointermove",
"timeStamp":216697842.0,
"pointer":12,
"x":247.42857360839844,
"y":466.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697849.0,
"pointer":12,
"x":254.2857208251953,
"y":497.71429443359375
},
{
"type":"pointerup",
"timeStamp":216697864.0,
"pointer":12,
"x":254.2857208251953,
"y":497.71429443359375
},
{
"type":"pointerdown",
"timeStamp":216698321.0,
"pointer":13,
"x":250.0,
"y":306.0
},
{
"type":"pointermove",
"timeStamp":216698328.0,
"pointer":13,
"x":250.0,
"y":306.0
},
{
"type":"pointermove",
"timeStamp":216698344.0,
"pointer":13,
"x":249.14285278320312,
"y":314.0
},
{
"type":"pointermove",
"timeStamp":216698351.0,
"pointer":13,
"x":247.42857360839844,
"y":319.4285583496094
},
{
"type":"pointermove",
"timeStamp":216698359.0,
"pointer":13,
"x":245.14285278320312,
"y":326.8571472167969
},
{
"type":"pointermove",
"timeStamp":216698366.0,
"pointer":13,
"x":241.7142791748047,
"y":339.4285583496094
},
{
"type":"pointermove",
"timeStamp":216698374.0,
"pointer":13,
"x":238.57142639160156,
"y":355.71429443359375
},
{
"type":"pointermove",
"timeStamp":216698382.0,
"pointer":13,
"x":236.2857208251953,
"y":374.28570556640625
},
{
"type":"pointermove",
"timeStamp":216698390.0,
"pointer":13,
"x":235.14285278320312,
"y":396.5714416503906
},
{
"type":"pointermove",
"timeStamp":216698398.0,
"pointer":13,
"x":236.57142639160156,
"y":421.4285583496094
},
{
"type":"pointermove",
"timeStamp":216698406.0,
"pointer":13,
"x":241.14285278320312,
"y":451.4285583496094
},
{
"type":"pointerup",
"timeStamp":216698421.0,
"pointer":13,
"x":241.14285278320312,
"y":451.4285583496094
}
]; ];
...@@ -16,85 +16,63 @@ class TestGestureArenaMember extends GestureArenaMember { ...@@ -16,85 +16,63 @@ class TestGestureArenaMember extends GestureArenaMember {
void main() { void main() {
// Down/up pair 1: normal tap sequence // Down/up pair 1: normal tap sequence
final PointerInputEvent down1 = new PointerInputEvent( const PointerDownEvent down1 = const PointerDownEvent(
pointer: 1, pointer: 1,
type: 'pointerdown', position: const Point(10.0, 10.0)
x: 10.0,
y: 10.0
); );
final PointerInputEvent up1 = new PointerInputEvent( const PointerUpEvent up1 = const PointerUpEvent(
pointer: 1, pointer: 1,
type: 'pointerup', position: const Point(11.0, 9.0)
x: 11.0,
y: 9.0
); );
// Down/up pair 2: normal tap sequence close to pair 1 // Down/up pair 2: normal tap sequence close to pair 1
final PointerInputEvent down2 = new PointerInputEvent( const PointerDownEvent down2 = const PointerDownEvent(
pointer: 2, pointer: 2,
type: 'pointerdown', position: const Point(12.0, 12.0)
x: 12.0,
y: 12.0
); );
final PointerInputEvent up2 = new PointerInputEvent( const PointerUpEvent up2 = const PointerUpEvent(
pointer: 2, pointer: 2,
type: 'pointerup', position: const Point(13.0, 11.0)
x: 13.0,
y: 11.0
); );
// Down/up pair 3: normal tap sequence far away from pair 1 // Down/up pair 3: normal tap sequence far away from pair 1
final PointerInputEvent down3 = new PointerInputEvent( const PointerDownEvent down3 = const PointerDownEvent(
pointer: 3, pointer: 3,
type: 'pointerdown', position: const Point(130.0, 130.0)
x: 130.0,
y: 130.0
); );
final PointerInputEvent up3 = new PointerInputEvent( const PointerUpEvent up3 = const PointerUpEvent(
pointer: 3, pointer: 3,
type: 'pointerup', position: const Point(131.0, 129.0)
x: 131.0,
y: 129.0
); );
// Down/move/up sequence 4: intervening motion // Down/move/up sequence 4: intervening motion
final PointerInputEvent down4 = new PointerInputEvent( const PointerDownEvent down4 = const PointerDownEvent(
pointer: 4, pointer: 4,
type: 'pointerdown', position: const Point(10.0, 10.0)
x: 10.0,
y: 10.0
); );
final PointerInputEvent move4 = new PointerInputEvent( const PointerMoveEvent move4 = const PointerMoveEvent(
pointer: 4, pointer: 4,
type: 'pointermove', position: const Point(25.0, 25.0)
x: 25.0,
y: 25.0
); );
final PointerInputEvent up4 = new PointerInputEvent( const PointerUpEvent up4 = const PointerUpEvent(
pointer: 4, pointer: 4,
type: 'pointerup', position: const Point(25.0, 25.0)
x: 25.0,
y: 25.0
); );
// Down/up pair 5: normal tap sequence identical to pair 1 with different pointer // Down/up pair 5: normal tap sequence identical to pair 1 with different pointer
final PointerInputEvent down5 = new PointerInputEvent( const PointerDownEvent down5 = const PointerDownEvent(
pointer: 5, pointer: 5,
type: 'pointerdown', position: const Point(10.0, 10.0)
x: 10.0,
y: 10.0
); );
final PointerInputEvent up5 = new PointerInputEvent( const PointerUpEvent up5 = const PointerUpEvent(
pointer: 5, pointer: 5,
type: 'pointerup', position: const Point(11.0, 9.0)
x: 11.0,
y: 9.0
); );
test('Should recognize double tap', () { test('Should recognize double tap', () {
...@@ -546,7 +524,7 @@ void main() { ...@@ -546,7 +524,7 @@ void main() {
expect(member.accepted, isFalse); expect(member.accepted, isFalse);
async.elapse(new Duration(milliseconds: 5000)); async.elapse(const Duration(milliseconds: 5000));
expect(member.accepted, isTrue); expect(member.accepted, isTrue);
}); });
......
...@@ -2,18 +2,14 @@ import 'package:quiver/testing/async.dart'; ...@@ -2,18 +2,14 @@ import 'package:quiver/testing/async.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
final PointerInputEvent down = new PointerInputEvent( const PointerDownEvent down = const PointerDownEvent(
pointer: 5, pointer: 5,
type: 'pointerdown', position: const Point(10.0, 10.0)
x: 10.0,
y: 10.0
); );
final PointerInputEvent up = new PointerInputEvent( const PointerUpEvent up = const PointerUpEvent(
pointer: 5, pointer: 5,
type: 'pointerup', position: const Point(11.0, 9.0)
x: 11.0,
y: 9.0
); );
void main() { void main() {
...@@ -32,9 +28,9 @@ void main() { ...@@ -32,9 +28,9 @@ void main() {
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(down); router.route(down);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(new Duration(milliseconds: 300)); async.elapse(const Duration(milliseconds: 300));
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(new Duration(milliseconds: 700)); async.elapse(const Duration(milliseconds: 700));
expect(longPressRecognized, isTrue); expect(longPressRecognized, isTrue);
}); });
...@@ -56,11 +52,11 @@ void main() { ...@@ -56,11 +52,11 @@ void main() {
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(down); router.route(down);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(new Duration(milliseconds: 300)); async.elapse(const Duration(milliseconds: 300));
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
router.route(up); router.route(up);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(new Duration(seconds: 1)); async.elapse(const Duration(seconds: 1));
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
}); });
...@@ -91,10 +87,10 @@ void main() { ...@@ -91,10 +87,10 @@ void main() {
router.route(down); router.route(down);
expect(tapDownRecognized, isFalse); expect(tapDownRecognized, isFalse);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(new Duration(milliseconds: 300)); async.elapse(const Duration(milliseconds: 300));
expect(tapDownRecognized, isTrue); expect(tapDownRecognized, isTrue);
expect(longPressRecognized, isFalse); expect(longPressRecognized, isFalse);
async.elapse(new Duration(milliseconds: 700)); async.elapse(const Duration(milliseconds: 700));
expect(tapDownRecognized, isTrue); expect(tapDownRecognized, isTrue);
expect(longPressRecognized, isTrue); expect(longPressRecognized, isTrue);
}); });
......
...@@ -9,9 +9,9 @@ void main() { ...@@ -9,9 +9,9 @@ void main() {
} }
test('Least-squares fit: linear polynomial to line', () { test('Least-squares fit: linear polynomial to line', () {
List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]; List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
List<double> y = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]; List<double> y = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]; List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w); LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
PolynomialFit fit = solver.solve(1); PolynomialFit fit = solver.solve(1);
...@@ -23,9 +23,9 @@ void main() { ...@@ -23,9 +23,9 @@ void main() {
}); });
test('Least-squares fit: linear polynomial to sloped line', () { test('Least-squares fit: linear polynomial to sloped line', () {
List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]; List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
List<double> y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]; List<double> y = <double>[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]; List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w); LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
PolynomialFit fit = solver.solve(1); PolynomialFit fit = solver.solve(1);
...@@ -37,9 +37,9 @@ void main() { ...@@ -37,9 +37,9 @@ void main() {
}); });
test('Least-squares fit: quadratic polynomial to line', () { test('Least-squares fit: quadratic polynomial to line', () {
List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]; List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
List<double> y = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]; List<double> y = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]; List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w); LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
PolynomialFit fit = solver.solve(2); PolynomialFit fit = solver.solve(2);
...@@ -52,9 +52,9 @@ void main() { ...@@ -52,9 +52,9 @@ void main() {
}); });
test('Least-squares fit: quadratic polynomial to sloped line', () { test('Least-squares fit: quadratic polynomial to sloped line', () {
List<double> x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]; List<double> x = <double>[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0];
List<double> y = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]; List<double> y = <double>[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
List<double> w = [1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0]; List<double> w = <double>[1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0];
LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w); LeastSquaresSolver solver = new LeastSquaresSolver(x, y, w);
PolynomialFit fit = solver.solve(2); PolynomialFit fit = solver.solve(2);
......
...@@ -5,7 +5,7 @@ import 'package:test/test.dart'; ...@@ -5,7 +5,7 @@ import 'package:test/test.dart';
void main() { void main() {
test('Should route pointers', () { test('Should route pointers', () {
bool callbackRan = false; bool callbackRan = false;
void callback(PointerInputEvent event) { void callback(PointerEvent event) {
callbackRan = true; callbackRan = true;
} }
......
import 'dart:ui' as ui;
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
...@@ -11,14 +9,14 @@ void main() { ...@@ -11,14 +9,14 @@ void main() {
TapGestureRecognizer tap = new TapGestureRecognizer(router: router); TapGestureRecognizer tap = new TapGestureRecognizer(router: router);
bool didStartScale = false; bool didStartScale = false;
ui.Point updatedFocalPoint; Point updatedFocalPoint;
scale.onStart = (ui.Point focalPoint) { scale.onStart = (Point focalPoint) {
didStartScale = true; didStartScale = true;
updatedFocalPoint = focalPoint; updatedFocalPoint = focalPoint;
}; };
double updatedScale; double updatedScale;
scale.onUpdate = (double scale, ui.Point focalPoint) { scale.onUpdate = (double scale, Point focalPoint) {
updatedScale = scale; updatedScale = scale;
updatedFocalPoint = focalPoint; updatedFocalPoint = focalPoint;
}; };
...@@ -35,7 +33,7 @@ void main() { ...@@ -35,7 +33,7 @@ void main() {
TestPointer pointer1 = new TestPointer(1); TestPointer pointer1 = new TestPointer(1);
PointerInputEvent down = pointer1.down(new Point(10.0, 10.0)); PointerDownEvent down = pointer1.down(const Point(10.0, 10.0));
scale.addPointer(down); scale.addPointer(down);
tap.addPointer(down); tap.addPointer(down);
...@@ -54,10 +52,10 @@ void main() { ...@@ -54,10 +52,10 @@ void main() {
expect(didEndScale, isFalse); expect(didEndScale, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer1.move(new Point(20.0, 30.0))); router.route(pointer1.move(const Point(20.0, 30.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); expect(updatedFocalPoint, const Point(20.0, 30.0));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 1.0); expect(updatedScale, 1.0);
updatedScale = null; updatedScale = null;
...@@ -66,7 +64,7 @@ void main() { ...@@ -66,7 +64,7 @@ void main() {
// Two-finger scaling // Two-finger scaling
TestPointer pointer2 = new TestPointer(2); TestPointer pointer2 = new TestPointer(2);
PointerInputEvent down2 = pointer2.down(new Point(10.0, 20.0)); PointerDownEvent down2 = pointer2.down(const Point(10.0, 20.0));
scale.addPointer(down2); scale.addPointer(down2);
tap.addPointer(down2); tap.addPointer(down2);
GestureArena.instance.close(2); GestureArena.instance.close(2);
...@@ -79,10 +77,10 @@ void main() { ...@@ -79,10 +77,10 @@ void main() {
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
router.route(pointer2.move(new Point(0.0, 10.0))); router.route(pointer2.move(const Point(0.0, 10.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, new ui.Point(10.0, 20.0)); expect(updatedFocalPoint, const Point(10.0, 20.0));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 2.0); expect(updatedScale, 2.0);
updatedScale = null; updatedScale = null;
...@@ -90,8 +88,8 @@ void main() { ...@@ -90,8 +88,8 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Zoom out // Zoom out
router.route(pointer2.move(new Point(15.0, 25.0))); router.route(pointer2.move(const Point(15.0, 25.0)));
expect(updatedFocalPoint, new ui.Point(17.5, 27.5)); expect(updatedFocalPoint, const Point(17.5, 27.5));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 0.5); expect(updatedScale, 0.5);
updatedScale = null; updatedScale = null;
...@@ -99,7 +97,7 @@ void main() { ...@@ -99,7 +97,7 @@ void main() {
// Three-finger scaling // Three-finger scaling
TestPointer pointer3 = new TestPointer(3); TestPointer pointer3 = new TestPointer(3);
PointerInputEvent down3 = pointer3.down(new Point(25.0, 35.0)); PointerDownEvent down3 = pointer3.down(const Point(25.0, 35.0));
scale.addPointer(down3); scale.addPointer(down3);
tap.addPointer(down3); tap.addPointer(down3);
GestureArena.instance.close(3); GestureArena.instance.close(3);
...@@ -112,10 +110,10 @@ void main() { ...@@ -112,10 +110,10 @@ void main() {
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
// Zoom in // Zoom in
router.route(pointer3.move(new Point(55.0, 65.0))); router.route(pointer3.move(const Point(55.0, 65.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, new ui.Point(30.0, 40.0)); expect(updatedFocalPoint, const Point(30.0, 40.0));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 5.0); expect(updatedScale, 5.0);
updatedScale = null; updatedScale = null;
...@@ -123,11 +121,11 @@ void main() { ...@@ -123,11 +121,11 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Return to original positions but with different fingers // Return to original positions but with different fingers
router.route(pointer1.move(new Point(25.0, 35.0))); router.route(pointer1.move(const Point(25.0, 35.0)));
router.route(pointer2.move(new Point(20.0, 30.0))); router.route(pointer2.move(const Point(20.0, 30.0)));
router.route(pointer3.move(new Point(15.0, 25.0))); router.route(pointer3.move(const Point(15.0, 25.0)));
expect(didStartScale, isFalse); expect(didStartScale, isFalse);
expect(updatedFocalPoint, new ui.Point(20.0, 30.0)); expect(updatedFocalPoint, const Point(20.0, 30.0));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 1.0); expect(updatedScale, 1.0);
updatedScale = null; updatedScale = null;
...@@ -143,10 +141,10 @@ void main() { ...@@ -143,10 +141,10 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Continue scaling with two fingers // Continue scaling with two fingers
router.route(pointer3.move(new Point(10.0, 20.0))); router.route(pointer3.move(const Point(10.0, 20.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, new ui.Point(15.0, 25.0)); expect(updatedFocalPoint, const Point(15.0, 25.0));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 2.0); expect(updatedScale, 2.0);
updatedScale = null; updatedScale = null;
...@@ -160,10 +158,10 @@ void main() { ...@@ -160,10 +158,10 @@ void main() {
expect(didTap, isFalse); expect(didTap, isFalse);
// Continue panning with one finger // Continue panning with one finger
router.route(pointer3.move(new Point(0.0, 0.0))); router.route(pointer3.move(const Point(0.0, 0.0)));
expect(didStartScale, isTrue); expect(didStartScale, isTrue);
didStartScale = false; didStartScale = false;
expect(updatedFocalPoint, new ui.Point(0.0, 0.0)); expect(updatedFocalPoint, const Point(0.0, 0.0));
updatedFocalPoint = null; updatedFocalPoint = null;
expect(updatedScale, 1.0); expect(updatedScale, 1.0);
updatedScale = null; updatedScale = null;
......
import 'dart:ui' as ui;
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/gestures.dart'; import 'package:flutter/gestures.dart';
import 'package:test/test.dart'; import 'package:test/test.dart';
...@@ -15,13 +13,13 @@ void main() { ...@@ -15,13 +13,13 @@ void main() {
didStartPan = true; didStartPan = true;
}; };
ui.Offset updatedScrollDelta; Offset updatedScrollDelta;
pan.onUpdate = (ui.Offset offset) { pan.onUpdate = (Offset offset) {
updatedScrollDelta = offset; updatedScrollDelta = offset;
}; };
bool didEndPan = false; bool didEndPan = false;
pan.onEnd = (ui.Offset velocity) { pan.onEnd = (Offset velocity) {
didEndPan = true; didEndPan = true;
}; };
...@@ -31,7 +29,7 @@ void main() { ...@@ -31,7 +29,7 @@ void main() {
}; };
TestPointer pointer = new TestPointer(5); TestPointer pointer = new TestPointer(5);
PointerInputEvent down = pointer.down(new Point(10.0, 10.0)); PointerDownEvent down = pointer.down(const Point(10.0, 10.0));
pan.addPointer(down); pan.addPointer(down);
tap.addPointer(down); tap.addPointer(down);
GestureArena.instance.close(5); GestureArena.instance.close(5);
...@@ -46,17 +44,17 @@ void main() { ...@@ -46,17 +44,17 @@ void main() {
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer.move(new Point(20.0, 20.0))); router.route(pointer.move(const Point(20.0, 20.0)));
expect(didStartPan, isTrue); expect(didStartPan, isTrue);
didStartPan = false; didStartPan = false;
expect(updatedScrollDelta, new ui.Offset(10.0, 10.0)); expect(updatedScrollDelta, const Offset(10.0, 10.0));
updatedScrollDelta = null; updatedScrollDelta = null;
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
router.route(pointer.move(new Point(20.0, 25.0))); router.route(pointer.move(const Point(20.0, 25.0)));
expect(didStartPan, isFalse); expect(didStartPan, isFalse);
expect(updatedScrollDelta, new ui.Offset(0.0, 5.0)); expect(updatedScrollDelta, const Offset(0.0, 5.0));
updatedScrollDelta = null; updatedScrollDelta = null;
expect(didEndPan, isFalse); expect(didEndPan, isFalse);
expect(didTap, isFalse); expect(didTap, isFalse);
......
...@@ -10,55 +10,41 @@ class TestGestureArenaMember extends GestureArenaMember { ...@@ -10,55 +10,41 @@ class TestGestureArenaMember extends GestureArenaMember {
void main() { void main() {
// Down/up pair 1: normal tap sequence // Down/up pair 1: normal tap sequence
final PointerInputEvent down1 = new PointerInputEvent( const PointerDownEvent down1 = const PointerDownEvent(
pointer: 1, pointer: 1,
type: 'pointerdown', position: const Point(10.0, 10.0)
x: 10.0,
y: 10.0
); );
final PointerInputEvent up1 = new PointerInputEvent( const PointerUpEvent up1 = const PointerUpEvent(
pointer: 1, pointer: 1,
type: 'pointerup', position: const Point(11.0, 9.0)
x: 11.0,
y: 9.0
); );
// Down/up pair 2: normal tap sequence far away from pair 1 // Down/up pair 2: normal tap sequence far away from pair 1
final PointerInputEvent down2 = new PointerInputEvent( const PointerDownEvent down2 = const PointerDownEvent(
pointer: 2, pointer: 2,
type: 'pointerdown', position: const Point(30.0, 30.0)
x: 30.0,
y: 30.0
); );
final PointerInputEvent up2 = new PointerInputEvent( const PointerUpEvent up2 = const PointerUpEvent(
pointer: 2, pointer: 2,
type: 'pointerup', position: const Point(31.0, 29.0)
x: 31.0,
y: 29.0
); );
// Down/move/up sequence 3: intervening motion // Down/move/up sequence 3: intervening motion
final PointerInputEvent down3 = new PointerInputEvent( const PointerDownEvent down3 = const PointerDownEvent(
pointer: 3, pointer: 3,
type: 'pointerdown', position: const Point(10.0, 10.0)
x: 10.0,
y: 10.0
); );
final PointerInputEvent move3 = new PointerInputEvent( const PointerMoveEvent move3 = const PointerMoveEvent(
pointer: 3, pointer: 3,
type: 'pointermove', position: const Point(25.0, 25.0)
x: 25.0,
y: 25.0
); );
final PointerInputEvent up3 = new PointerInputEvent( const PointerUpEvent up3 = const PointerUpEvent(
pointer: 3, pointer: 3,
type: 'pointerup', position: const Point(25.0, 25.0)
x: 25.0,
y: 25.0
); );
test('Should recognize tap', () { test('Should recognize tap', () {
......
final List<Map> velocityEventData = [ import 'package:flutter/gestures.dart';
{
"type":"pointerdown", const List<PointerEvent> velocityEventData = const <PointerEvent>[
"timeStamp":216690896.0, const PointerDownEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216690896),
"x":270.0, pointer: 1,
"y":538.2857055664062 position: const Point(270.0, 538.2857055664062)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216690906),
"timeStamp":216690906.0, pointer: 1,
"pointer":1, position: const Point(270.0, 538.2857055664062)
"x":270.0, ),
"y":538.2857055664062 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216690951),
{ pointer: 1,
"type":"pointermove", position: const Point(270.0, 530.8571166992188)
"timeStamp":216690951.0, ),
"pointer":1, const PointerMoveEvent(
"x":270.0, timeStamp: const Duration(milliseconds: 216690959),
"y":530.8571166992188 pointer: 1,
}, position: const Point(270.0, 526.8571166992188)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216690959.0, timeStamp: const Duration(milliseconds: 216690967),
"pointer":1, pointer: 1,
"x":270.0, position: const Point(270.0, 521.4285888671875)
"y":526.8571166992188 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216690975),
"type":"pointermove", pointer: 1,
"timeStamp":216690967.0, position: const Point(270.0, 515.4285888671875)
"pointer":1, ),
"x":270.0, const PointerMoveEvent(
"y":521.4285888671875 timeStamp: const Duration(milliseconds: 216690983),
}, pointer: 1,
{ position: const Point(270.0, 506.8571472167969)
"type":"pointermove", ),
"timeStamp":216690975.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216690991),
"x":270.0, pointer: 1,
"y":515.4285888671875 position: const Point(268.8571472167969, 496.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216690998),
"timeStamp":216690983.0, pointer: 1,
"pointer":1, position: const Point(267.4285583496094, 483.1428527832031)
"x":270.0, ),
"y":506.8571472167969 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691006),
{ pointer: 1,
"type":"pointermove", position: const Point(266.28570556640625, 469.71429443359375)
"timeStamp":216690991.0, ),
"pointer":1, const PointerMoveEvent(
"x":268.8571472167969, timeStamp: const Duration(milliseconds: 216691014),
"y":496.0 pointer: 1,
}, position: const Point(265.4285583496094, 456.8571472167969)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216690998.0, timeStamp: const Duration(milliseconds: 216691021),
"pointer":1, pointer: 1,
"x":267.4285583496094, position: const Point(264.28570556640625, 443.71429443359375)
"y":483.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691029),
"type":"pointermove", pointer: 1,
"timeStamp":216691006.0, position: const Point(264.0, 431.71429443359375)
"pointer":1, ),
"x":266.28570556640625, const PointerMoveEvent(
"y":469.71429443359375 timeStamp: const Duration(milliseconds: 216691036),
}, pointer: 1,
{ position: const Point(263.4285583496094, 421.1428527832031)
"type":"pointermove", ),
"timeStamp":216691014.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691044),
"x":265.4285583496094, pointer: 1,
"y":456.8571472167969 position: const Point(263.4285583496094, 412.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691052),
"timeStamp":216691021.0, pointer: 1,
"pointer":1, position: const Point(263.4285583496094, 404.5714416503906)
"x":264.28570556640625, ),
"y":443.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691060),
{ pointer: 1,
"type":"pointermove", position: const Point(263.4285583496094, 396.5714416503906)
"timeStamp":216691029.0, ),
"pointer":1, const PointerMoveEvent(
"x":264.0, timeStamp: const Duration(milliseconds: 216691068),
"y":431.71429443359375 pointer: 1,
}, position: const Point(264.5714416503906, 390.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691036.0, timeStamp: const Duration(milliseconds: 216691075),
"pointer":1, pointer: 1,
"x":263.4285583496094, position: const Point(265.1428527832031, 384.8571472167969)
"y":421.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691083),
"type":"pointermove", pointer: 1,
"timeStamp":216691044.0, position: const Point(266.0, 380.28570556640625)
"pointer":1, ),
"x":263.4285583496094, const PointerMoveEvent(
"y":412.5714416503906 timeStamp: const Duration(milliseconds: 216691091),
}, pointer: 1,
{ position: const Point(266.5714416503906, 376.28570556640625)
"type":"pointermove", ),
"timeStamp":216691052.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691098),
"x":263.4285583496094, pointer: 1,
"y":404.5714416503906 position: const Point(267.1428527832031, 373.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691106),
"timeStamp":216691060.0, pointer: 1,
"pointer":1, position: const Point(267.71429443359375, 370.28570556640625)
"x":263.4285583496094, ),
"y":396.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691114),
{ pointer: 1,
"type":"pointermove", position: const Point(268.28570556640625, 367.71429443359375)
"timeStamp":216691068.0, ),
"pointer":1, const PointerMoveEvent(
"x":264.5714416503906, timeStamp: const Duration(milliseconds: 216691121),
"y":390.0 pointer: 1,
}, position: const Point(268.5714416503906, 366.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691075.0, timeStamp: const Duration(milliseconds: 216691130),
"pointer":1, pointer: 1,
"x":265.1428527832031, position: const Point(268.8571472167969, 364.5714416503906)
"y":384.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691137),
"type":"pointermove", pointer: 1,
"timeStamp":216691083.0, position: const Point(269.1428527832031, 363.71429443359375)
"pointer":1, ),
"x":266.0, const PointerMoveEvent(
"y":380.28570556640625 timeStamp: const Duration(milliseconds: 216691145),
}, pointer: 1,
{ position: const Point(269.1428527832031, 362.8571472167969)
"type":"pointermove", ),
"timeStamp":216691091.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691153),
"x":266.5714416503906, pointer: 1,
"y":376.28570556640625 position: const Point(269.4285583496094, 362.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691168),
"timeStamp":216691098.0, pointer: 1,
"pointer":1, position: const Point(268.5714416503906, 365.4285583496094)
"x":267.1428527832031, ),
"y":373.1428527832031 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691176),
{ pointer: 1,
"type":"pointermove", position: const Point(267.1428527832031, 370.28570556640625)
"timeStamp":216691106.0, ),
"pointer":1, const PointerMoveEvent(
"x":267.71429443359375, timeStamp: const Duration(milliseconds: 216691183),
"y":370.28570556640625 pointer: 1,
}, position: const Point(265.4285583496094, 376.8571472167969)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691114.0, timeStamp: const Duration(milliseconds: 216691191),
"pointer":1, pointer: 1,
"x":268.28570556640625, position: const Point(263.1428527832031, 385.71429443359375)
"y":367.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691199),
"type":"pointermove", pointer: 1,
"timeStamp":216691121.0, position: const Point(261.4285583496094, 396.5714416503906)
"pointer":1, ),
"x":268.5714416503906, const PointerMoveEvent(
"y":366.0 timeStamp: const Duration(milliseconds: 216691207),
}, pointer: 1,
{ position: const Point(259.71429443359375, 408.5714416503906)
"type":"pointermove", ),
"timeStamp":216691130.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691215),
"x":268.8571472167969, pointer: 1,
"y":364.5714416503906 position: const Point(258.28570556640625, 419.4285583496094)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691222),
"timeStamp":216691137.0, pointer: 1,
"pointer":1, position: const Point(257.4285583496094, 428.5714416503906)
"x":269.1428527832031, ),
"y":363.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691230),
{ pointer: 1,
"type":"pointermove", position: const Point(256.28570556640625, 436.0)
"timeStamp":216691145.0, ),
"pointer":1, const PointerMoveEvent(
"x":269.1428527832031, timeStamp: const Duration(milliseconds: 216691238),
"y":362.8571472167969 pointer: 1,
}, position: const Point(255.7142791748047, 442.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691153.0, timeStamp: const Duration(milliseconds: 216691245),
"pointer":1, pointer: 1,
"x":269.4285583496094, position: const Point(255.14285278320312, 447.71429443359375)
"y":362.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691253),
"type":"pointermove", pointer: 1,
"timeStamp":216691168.0, position: const Point(254.85714721679688, 453.1428527832031)
"pointer":1, ),
"x":268.5714416503906, const PointerMoveEvent(
"y":365.4285583496094 timeStamp: const Duration(milliseconds: 216691261),
}, pointer: 1,
{ position: const Point(254.57142639160156, 458.5714416503906)
"type":"pointermove", ),
"timeStamp":216691176.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691268),
"x":267.1428527832031, pointer: 1,
"y":370.28570556640625 position: const Point(254.2857208251953, 463.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691276),
"timeStamp":216691183.0, pointer: 1,
"pointer":1, position: const Point(254.2857208251953, 470.28570556640625)
"x":265.4285583496094, ),
"y":376.8571472167969 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691284),
{ pointer: 1,
"type":"pointermove", position: const Point(254.2857208251953, 477.71429443359375)
"timeStamp":216691191.0, ),
"pointer":1, const PointerMoveEvent(
"x":263.1428527832031, timeStamp: const Duration(milliseconds: 216691292),
"y":385.71429443359375 pointer: 1,
}, position: const Point(255.7142791748047, 487.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691199.0, timeStamp: const Duration(milliseconds: 216691300),
"pointer":1, pointer: 1,
"x":261.4285583496094, position: const Point(256.8571472167969, 498.5714416503906)
"y":396.5714416503906 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691307),
"type":"pointermove", pointer: 1,
"timeStamp":216691207.0, position: const Point(258.28570556640625, 507.71429443359375)
"pointer":1, ),
"x":259.71429443359375, const PointerMoveEvent(
"y":408.5714416503906 timeStamp: const Duration(milliseconds: 216691315),
}, pointer: 1,
{ position: const Point(259.4285583496094, 516.0)
"type":"pointermove", ),
"timeStamp":216691215.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691323),
"x":258.28570556640625, pointer: 1,
"y":419.4285583496094 position: const Point(260.28570556640625, 521.7142944335938)
}, ),
{ const PointerUpEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691338),
"timeStamp":216691222.0, pointer: 1,
"pointer":1, position: const Point(260.28570556640625, 521.7142944335938)
"x":257.4285583496094, ),
"y":428.5714416503906 const PointerDownEvent(
}, timeStamp: const Duration(milliseconds: 216691573),
{ pointer: 2,
"type":"pointermove", position: const Point(266.0, 327.4285583496094)
"timeStamp":216691230.0, ),
"pointer":1, const PointerMoveEvent(
"x":256.28570556640625, timeStamp: const Duration(milliseconds: 216691588),
"y":436.0 pointer: 2,
}, position: const Point(266.0, 327.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691238.0, timeStamp: const Duration(milliseconds: 216691626),
"pointer":1, pointer: 2,
"x":255.7142791748047, position: const Point(261.1428527832031, 337.1428527832031)
"y":442.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691634),
"type":"pointermove", pointer: 2,
"timeStamp":216691245.0, position: const Point(258.28570556640625, 343.1428527832031)
"pointer":1, ),
"x":255.14285278320312, const PointerMoveEvent(
"y":447.71429443359375 timeStamp: const Duration(milliseconds: 216691642),
}, pointer: 2,
{ position: const Point(254.57142639160156, 354.0)
"type":"pointermove", ),
"timeStamp":216691253.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691650),
"x":254.85714721679688, pointer: 2,
"y":453.1428527832031 position: const Point(250.2857208251953, 368.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691657),
"timeStamp":216691261.0, pointer: 2,
"pointer":1, position: const Point(247.42857360839844, 382.8571472167969)
"x":254.57142639160156, ),
"y":458.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691665),
{ pointer: 2,
"type":"pointermove", position: const Point(245.14285278320312, 397.4285583496094)
"timeStamp":216691268.0, ),
"pointer":1, const PointerMoveEvent(
"x":254.2857208251953, timeStamp: const Duration(milliseconds: 216691673),
"y":463.71429443359375 pointer: 2,
}, position: const Point(243.14285278320312, 411.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691276.0, timeStamp: const Duration(milliseconds: 216691680),
"pointer":1, pointer: 2,
"x":254.2857208251953, position: const Point(242.2857208251953, 426.28570556640625)
"y":470.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216691688),
"type":"pointermove", pointer: 2,
"timeStamp":216691284.0, position: const Point(241.7142791748047, 440.5714416503906)
"pointer":1, ),
"x":254.2857208251953, const PointerMoveEvent(
"y":477.71429443359375 timeStamp: const Duration(milliseconds: 216691696),
}, pointer: 2,
{ position: const Point(241.7142791748047, 454.5714416503906)
"type":"pointermove", ),
"timeStamp":216691292.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216691703),
"x":255.7142791748047, pointer: 2,
"y":487.1428527832031 position: const Point(242.57142639160156, 467.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216691712),
"timeStamp":216691300.0, pointer: 2,
"pointer":1, position: const Point(243.42857360839844, 477.4285583496094)
"x":256.8571472167969, ),
"y":498.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216691720),
{ pointer: 2,
"type":"pointermove", position: const Point(244.85714721679688, 485.71429443359375)
"timeStamp":216691307.0, ),
"pointer":1, const PointerMoveEvent(
"x":258.28570556640625, timeStamp: const Duration(milliseconds: 216691727),
"y":507.71429443359375 pointer: 2,
}, position: const Point(246.2857208251953, 493.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691315.0, timeStamp: const Duration(milliseconds: 216691735),
"pointer":1, pointer: 2,
"x":259.4285583496094, position: const Point(248.0, 499.71429443359375)
"y":516.0 ),
}, const PointerUpEvent(
{ timeStamp: const Duration(milliseconds: 216691750),
"type":"pointermove", pointer: 2,
"timeStamp":216691323.0, position: const Point(248.0, 499.71429443359375)
"pointer":1, ),
"x":260.28570556640625, const PointerDownEvent(
"y":521.7142944335938 timeStamp: const Duration(milliseconds: 216692255),
}, pointer: 3,
{ position: const Point(249.42857360839844, 351.4285583496094)
"type":"pointerup", ),
"timeStamp":216691338.0, const PointerMoveEvent(
"pointer":1, timeStamp: const Duration(milliseconds: 216692270),
"x":260.28570556640625, pointer: 3,
"y":521.7142944335938 position: const Point(249.42857360839844, 351.4285583496094)
}, ),
{ const PointerMoveEvent(
"type":"pointerdown", timeStamp: const Duration(milliseconds: 216692309),
"timeStamp":216691573.0, pointer: 3,
"pointer":2, position: const Point(246.2857208251953, 361.71429443359375)
"x":266.0, ),
"y":327.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692317),
{ pointer: 3,
"type":"pointermove", position: const Point(244.0, 368.5714416503906)
"timeStamp":216691588.0, ),
"pointer":2, const PointerMoveEvent(
"x":266.0, timeStamp: const Duration(milliseconds: 216692325),
"y":327.4285583496094 pointer: 3,
}, position: const Point(241.42857360839844, 377.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691626.0, timeStamp: const Duration(milliseconds: 216692333),
"pointer":2, pointer: 3,
"x":261.1428527832031, position: const Point(237.7142791748047, 391.71429443359375)
"y":337.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692340),
"type":"pointermove", pointer: 3,
"timeStamp":216691634.0, position: const Point(235.14285278320312, 406.5714416503906)
"pointer":2, ),
"x":258.28570556640625, const PointerMoveEvent(
"y":343.1428527832031 timeStamp: const Duration(milliseconds: 216692348),
}, pointer: 3,
{ position: const Point(232.57142639160156, 421.4285583496094)
"type":"pointermove", ),
"timeStamp":216691642.0, const PointerMoveEvent(
"pointer":2, timeStamp: const Duration(milliseconds: 216692356),
"x":254.57142639160156, pointer: 3,
"y":354.0 position: const Point(230.2857208251953, 436.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692363),
"timeStamp":216691650.0, pointer: 3,
"pointer":2, position: const Point(228.2857208251953, 451.71429443359375)
"x":250.2857208251953, ),
"y":368.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692371),
{ pointer: 3,
"type":"pointermove", position: const Point(227.42857360839844, 466.0)
"timeStamp":216691657.0, ),
"pointer":2, const PointerMoveEvent(
"x":247.42857360839844, timeStamp: const Duration(milliseconds: 216692378),
"y":382.8571472167969 pointer: 3,
}, position: const Point(226.2857208251953, 479.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691665.0, timeStamp: const Duration(milliseconds: 216692387),
"pointer":2, pointer: 3,
"x":245.14285278320312, position: const Point(225.7142791748047, 491.71429443359375)
"y":397.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692395),
"type":"pointermove", pointer: 3,
"timeStamp":216691673.0, position: const Point(225.14285278320312, 501.71429443359375)
"pointer":2, ),
"x":243.14285278320312, const PointerMoveEvent(
"y":411.71429443359375 timeStamp: const Duration(milliseconds: 216692402),
}, pointer: 3,
{ position: const Point(224.85714721679688, 509.1428527832031)
"type":"pointermove", ),
"timeStamp":216691680.0, const PointerMoveEvent(
"pointer":2, timeStamp: const Duration(milliseconds: 216692410),
"x":242.2857208251953, pointer: 3,
"y":426.28570556640625 position: const Point(224.57142639160156, 514.8571166992188)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692418),
"timeStamp":216691688.0, pointer: 3,
"pointer":2, position: const Point(224.2857208251953, 519.4285888671875)
"x":241.7142791748047, ),
"y":440.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692425),
{ pointer: 3,
"type":"pointermove", position: const Point(224.0, 523.4285888671875)
"timeStamp":216691696.0, ),
"pointer":2, const PointerMoveEvent(
"x":241.7142791748047, timeStamp: const Duration(milliseconds: 216692433),
"y":454.5714416503906 pointer: 3,
}, position: const Point(224.0, 527.1428833007812)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216691703.0, timeStamp: const Duration(milliseconds: 216692441),
"pointer":2, pointer: 3,
"x":242.57142639160156, position: const Point(224.0, 530.5714111328125)
"y":467.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692448),
"type":"pointermove", pointer: 3,
"timeStamp":216691712.0, position: const Point(224.0, 533.1428833007812)
"pointer":2, ),
"x":243.42857360839844, const PointerMoveEvent(
"y":477.4285583496094 timeStamp: const Duration(milliseconds: 216692456),
}, pointer: 3,
{ position: const Point(224.0, 535.4285888671875)
"type":"pointermove", ),
"timeStamp":216691720.0, const PointerMoveEvent(
"pointer":2, timeStamp: const Duration(milliseconds: 216692464),
"x":244.85714721679688, pointer: 3,
"y":485.71429443359375 position: const Point(223.7142791748047, 536.8571166992188)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692472),
"timeStamp":216691727.0, pointer: 3,
"pointer":2, position: const Point(223.7142791748047, 538.2857055664062)
"x":246.2857208251953, ),
"y":493.1428527832031 const PointerUpEvent(
}, timeStamp: const Duration(milliseconds: 216692487),
{ pointer: 3,
"type":"pointermove", position: const Point(223.7142791748047, 538.2857055664062)
"timeStamp":216691735.0, ),
"pointer":2, const PointerDownEvent(
"x":248.0, timeStamp: const Duration(milliseconds: 216692678),
"y":499.71429443359375 pointer: 4,
}, position: const Point(221.42857360839844, 526.2857055664062)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216691750.0, timeStamp: const Duration(milliseconds: 216692701),
"pointer":2, pointer: 4,
"x":248.0, position: const Point(220.57142639160156, 514.8571166992188)
"y":499.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692708),
"type":"pointerdown", pointer: 4,
"timeStamp":216692255.0, position: const Point(220.2857208251953, 508.0)
"pointer":3, ),
"x":249.42857360839844, const PointerMoveEvent(
"y":351.4285583496094 timeStamp: const Duration(milliseconds: 216692716),
}, pointer: 4,
{ position: const Point(220.2857208251953, 498.0)
"type":"pointermove", ),
"timeStamp":216692270.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216692724),
"x":249.42857360839844, pointer: 4,
"y":351.4285583496094 position: const Point(221.14285278320312, 484.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692732),
"timeStamp":216692309.0, pointer: 4,
"pointer":3, position: const Point(221.7142791748047, 469.4285583496094)
"x":246.2857208251953, ),
"y":361.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692740),
{ pointer: 4,
"type":"pointermove", position: const Point(223.42857360839844, 453.1428527832031)
"timeStamp":216692317.0, ),
"pointer":3, const PointerMoveEvent(
"x":244.0, timeStamp: const Duration(milliseconds: 216692748),
"y":368.5714416503906 pointer: 4,
}, position: const Point(225.7142791748047, 436.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692325.0, timeStamp: const Duration(milliseconds: 216692755),
"pointer":3, pointer: 4,
"x":241.42857360839844, position: const Point(229.14285278320312, 418.28570556640625)
"y":377.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216692763),
"type":"pointermove", pointer: 4,
"timeStamp":216692333.0, position: const Point(232.85714721679688, 400.28570556640625)
"pointer":3, ),
"x":237.7142791748047, const PointerMoveEvent(
"y":391.71429443359375 timeStamp: const Duration(milliseconds: 216692770),
}, pointer: 4,
{ position: const Point(236.85714721679688, 382.5714416503906)
"type":"pointermove", ),
"timeStamp":216692340.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216692778),
"x":235.14285278320312, pointer: 4,
"y":406.5714416503906 position: const Point(241.14285278320312, 366.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216692786),
"timeStamp":216692348.0, pointer: 4,
"pointer":3, position: const Point(244.85714721679688, 350.28570556640625)
"x":232.57142639160156, ),
"y":421.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216692793),
{ pointer: 4,
"type":"pointermove", position: const Point(249.14285278320312, 335.4285583496094)
"timeStamp":216692356.0, ),
"pointer":3, const PointerUpEvent(
"x":230.2857208251953, timeStamp: const Duration(milliseconds: 216692809),
"y":436.5714416503906 pointer: 4,
}, position: const Point(249.14285278320312, 335.4285583496094)
{ ),
"type":"pointermove", const PointerDownEvent(
"timeStamp":216692363.0, timeStamp: const Duration(milliseconds: 216693222),
"pointer":3, pointer: 5,
"x":228.2857208251953, position: const Point(224.0, 545.4285888671875)
"y":451.71429443359375 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216693245),
"type":"pointermove", pointer: 5,
"timeStamp":216692371.0, position: const Point(224.0, 545.4285888671875)
"pointer":3, ),
"x":227.42857360839844, const PointerMoveEvent(
"y":466.0 timeStamp: const Duration(milliseconds: 216693275),
}, pointer: 5,
{ position: const Point(222.85714721679688, 535.1428833007812)
"type":"pointermove", ),
"timeStamp":216692378.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216693284),
"x":226.2857208251953, pointer: 5,
"y":479.71429443359375 position: const Point(222.85714721679688, 528.8571166992188)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216693291),
"timeStamp":216692387.0, pointer: 5,
"pointer":3, position: const Point(222.2857208251953, 518.5714111328125)
"x":225.7142791748047, ),
"y":491.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216693299),
{ pointer: 5,
"type":"pointermove", position: const Point(222.0, 503.4285583496094)
"timeStamp":216692395.0, ),
"pointer":3, const PointerMoveEvent(
"x":225.14285278320312, timeStamp: const Duration(milliseconds: 216693307),
"y":501.71429443359375 pointer: 5,
}, position: const Point(222.0, 485.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692402.0, timeStamp: const Duration(milliseconds: 216693314),
"pointer":3, pointer: 5,
"x":224.85714721679688, position: const Point(221.7142791748047, 464.0)
"y":509.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216693322),
"type":"pointermove", pointer: 5,
"timeStamp":216692410.0, position: const Point(222.2857208251953, 440.28570556640625)
"pointer":3, ),
"x":224.57142639160156, const PointerUpEvent(
"y":514.8571166992188 timeStamp: const Duration(milliseconds: 216693337),
}, pointer: 5,
{ position: const Point(222.2857208251953, 440.28570556640625)
"type":"pointermove", ),
"timeStamp":216692418.0, const PointerDownEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216693985),
"x":224.2857208251953, pointer: 6,
"y":519.4285888671875 position: const Point(208.0, 544.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694047),
"timeStamp":216692425.0, pointer: 6,
"pointer":3, position: const Point(208.57142639160156, 532.2857055664062)
"x":224.0, ),
"y":523.4285888671875 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694054),
{ pointer: 6,
"type":"pointermove", position: const Point(208.85714721679688, 525.7142944335938)
"timeStamp":216692433.0, ),
"pointer":3, const PointerMoveEvent(
"x":224.0, timeStamp: const Duration(milliseconds: 216694062),
"y":527.1428833007812 pointer: 6,
}, position: const Point(208.85714721679688, 515.1428833007812)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692441.0, timeStamp: const Duration(milliseconds: 216694070),
"pointer":3, pointer: 6,
"x":224.0, position: const Point(208.0, 501.4285583496094)
"y":530.5714111328125 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694077),
"type":"pointermove", pointer: 6,
"timeStamp":216692448.0, position: const Point(207.42857360839844, 487.1428527832031)
"pointer":3, ),
"x":224.0, const PointerMoveEvent(
"y":533.1428833007812 timeStamp: const Duration(milliseconds: 216694085),
}, pointer: 6,
{ position: const Point(206.57142639160156, 472.8571472167969)
"type":"pointermove", ),
"timeStamp":216692456.0, const PointerMoveEvent(
"pointer":3, timeStamp: const Duration(milliseconds: 216694092),
"x":224.0, pointer: 6,
"y":535.4285888671875 position: const Point(206.57142639160156, 458.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694100),
"timeStamp":216692464.0, pointer: 6,
"pointer":3, position: const Point(206.57142639160156, 446.0)
"x":223.7142791748047, ),
"y":536.8571166992188 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694108),
{ pointer: 6,
"type":"pointermove", position: const Point(206.57142639160156, 434.28570556640625)
"timeStamp":216692472.0, ),
"pointer":3, const PointerMoveEvent(
"x":223.7142791748047, timeStamp: const Duration(milliseconds: 216694116),
"y":538.2857055664062 pointer: 6,
}, position: const Point(207.14285278320312, 423.71429443359375)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216692487.0, timeStamp: const Duration(milliseconds: 216694124),
"pointer":3, pointer: 6,
"x":223.7142791748047, position: const Point(208.57142639160156, 412.8571472167969)
"y":538.2857055664062 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694131),
"type":"pointerdown", pointer: 6,
"timeStamp":216692678.0, position: const Point(209.7142791748047, 402.28570556640625)
"pointer":4, ),
"x":221.42857360839844, const PointerMoveEvent(
"y":526.2857055664062 timeStamp: const Duration(milliseconds: 216694139),
}, pointer: 6,
{ position: const Point(211.7142791748047, 393.1428527832031)
"type":"pointermove", ),
"timeStamp":216692701.0, const PointerMoveEvent(
"pointer":4, timeStamp: const Duration(milliseconds: 216694147),
"x":220.57142639160156, pointer: 6,
"y":514.8571166992188 position: const Point(213.42857360839844, 385.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694154),
"timeStamp":216692708.0, pointer: 6,
"pointer":4, position: const Point(215.42857360839844, 378.28570556640625)
"x":220.2857208251953, ),
"y":508.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694162),
{ pointer: 6,
"type":"pointermove", position: const Point(217.42857360839844, 371.71429443359375)
"timeStamp":216692716.0, ),
"pointer":4, const PointerMoveEvent(
"x":220.2857208251953, timeStamp: const Duration(milliseconds: 216694169),
"y":498.0 pointer: 6,
}, position: const Point(219.42857360839844, 366.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692724.0, timeStamp: const Duration(milliseconds: 216694177),
"pointer":4, pointer: 6,
"x":221.14285278320312, position: const Point(221.42857360839844, 360.8571472167969)
"y":484.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694185),
"type":"pointermove", pointer: 6,
"timeStamp":216692732.0, position: const Point(223.42857360839844, 356.5714416503906)
"pointer":4, ),
"x":221.7142791748047, const PointerMoveEvent(
"y":469.4285583496094 timeStamp: const Duration(milliseconds: 216694193),
}, pointer: 6,
{ position: const Point(225.14285278320312, 352.28570556640625)
"type":"pointermove", ),
"timeStamp":216692740.0, const PointerMoveEvent(
"pointer":4, timeStamp: const Duration(milliseconds: 216694201),
"x":223.42857360839844, pointer: 6,
"y":453.1428527832031 position: const Point(226.85714721679688, 348.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694209),
"timeStamp":216692748.0, pointer: 6,
"pointer":4, position: const Point(228.2857208251953, 346.0)
"x":225.7142791748047, ),
"y":436.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694216),
{ pointer: 6,
"type":"pointermove", position: const Point(229.14285278320312, 343.71429443359375)
"timeStamp":216692755.0, ),
"pointer":4, const PointerMoveEvent(
"x":229.14285278320312, timeStamp: const Duration(milliseconds: 216694224),
"y":418.28570556640625 pointer: 6,
}, position: const Point(230.0, 342.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216692763.0, timeStamp: const Duration(milliseconds: 216694232),
"pointer":4, pointer: 6,
"x":232.85714721679688, position: const Point(230.57142639160156, 340.5714416503906)
"y":400.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694239),
"type":"pointermove", pointer: 6,
"timeStamp":216692770.0, position: const Point(230.85714721679688, 339.71429443359375)
"pointer":4, ),
"x":236.85714721679688, const PointerMoveEvent(
"y":382.5714416503906 timeStamp: const Duration(milliseconds: 216694247),
}, pointer: 6,
{ position: const Point(230.85714721679688, 339.4285583496094)
"type":"pointermove", ),
"timeStamp":216692778.0, const PointerMoveEvent(
"pointer":4, timeStamp: const Duration(milliseconds: 216694262),
"x":241.14285278320312, pointer: 6,
"y":366.0 position: const Point(230.2857208251953, 342.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694270),
"timeStamp":216692786.0, pointer: 6,
"pointer":4, position: const Point(228.85714721679688, 346.28570556640625)
"x":244.85714721679688, ),
"y":350.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694278),
{ pointer: 6,
"type":"pointermove", position: const Point(227.14285278320312, 352.5714416503906)
"timeStamp":216692793.0, ),
"pointer":4, const PointerMoveEvent(
"x":249.14285278320312, timeStamp: const Duration(milliseconds: 216694286),
"y":335.4285583496094 pointer: 6,
}, position: const Point(225.42857360839844, 359.4285583496094)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216692809.0, timeStamp: const Duration(milliseconds: 216694294),
"pointer":4, pointer: 6,
"x":249.14285278320312, position: const Point(223.7142791748047, 367.71429443359375)
"y":335.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694301),
"type":"pointerdown", pointer: 6,
"timeStamp":216693222.0, position: const Point(222.57142639160156, 376.0)
"pointer":5, ),
"x":224.0, const PointerMoveEvent(
"y":545.4285888671875 timeStamp: const Duration(milliseconds: 216694309),
}, pointer: 6,
{ position: const Point(221.42857360839844, 384.28570556640625)
"type":"pointermove", ),
"timeStamp":216693245.0, const PointerMoveEvent(
"pointer":5, timeStamp: const Duration(milliseconds: 216694317),
"x":224.0, pointer: 6,
"y":545.4285888671875 position: const Point(220.85714721679688, 392.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694324),
"timeStamp":216693275.0, pointer: 6,
"pointer":5, position: const Point(220.0, 400.5714416503906)
"x":222.85714721679688, ),
"y":535.1428833007812 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694332),
{ pointer: 6,
"type":"pointermove", position: const Point(219.14285278320312, 409.71429443359375)
"timeStamp":216693284.0, ),
"pointer":5, const PointerMoveEvent(
"x":222.85714721679688, timeStamp: const Duration(milliseconds: 216694339),
"y":528.8571166992188 pointer: 6,
}, position: const Point(218.85714721679688, 419.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216693291.0, timeStamp: const Duration(milliseconds: 216694348),
"pointer":5, pointer: 6,
"x":222.2857208251953, position: const Point(218.2857208251953, 428.8571472167969)
"y":518.5714111328125 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694356),
"type":"pointermove", pointer: 6,
"timeStamp":216693299.0, position: const Point(218.2857208251953, 438.8571472167969)
"pointer":5, ),
"x":222.0, const PointerMoveEvent(
"y":503.4285583496094 timeStamp: const Duration(milliseconds: 216694363),
}, pointer: 6,
{ position: const Point(218.2857208251953, 447.71429443359375)
"type":"pointermove", ),
"timeStamp":216693307.0, const PointerMoveEvent(
"pointer":5, timeStamp: const Duration(milliseconds: 216694371),
"x":222.0, pointer: 6,
"y":485.4285583496094 position: const Point(218.2857208251953, 455.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694379),
"timeStamp":216693314.0, pointer: 6,
"pointer":5, position: const Point(219.14285278320312, 462.8571472167969)
"x":221.7142791748047, ),
"y":464.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694386),
{ pointer: 6,
"type":"pointermove", position: const Point(220.0, 469.4285583496094)
"timeStamp":216693322.0, ),
"pointer":5, const PointerMoveEvent(
"x":222.2857208251953, timeStamp: const Duration(milliseconds: 216694394),
"y":440.28570556640625 pointer: 6,
}, position: const Point(221.14285278320312, 475.4285583496094)
{ ),
"type":"pointerup", const PointerMoveEvent(
"timeStamp":216693337.0, timeStamp: const Duration(milliseconds: 216694401),
"pointer":5, pointer: 6,
"x":222.2857208251953, position: const Point(222.0, 480.5714416503906)
"y":440.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694409),
"type":"pointerdown", pointer: 6,
"timeStamp":216693985.0, position: const Point(222.85714721679688, 485.4285583496094)
"pointer":6, ),
"x":208.0, const PointerMoveEvent(
"y":544.0 timeStamp: const Duration(milliseconds: 216694417),
}, pointer: 6,
{ position: const Point(224.0, 489.71429443359375)
"type":"pointermove", ),
"timeStamp":216694047.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694425),
"x":208.57142639160156, pointer: 6,
"y":532.2857055664062 position: const Point(224.85714721679688, 492.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694433),
"timeStamp":216694054.0, pointer: 6,
"pointer":6, position: const Point(225.42857360839844, 495.4285583496094)
"x":208.85714721679688, ),
"y":525.7142944335938 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694440),
{ pointer: 6,
"type":"pointermove", position: const Point(226.0, 497.1428527832031)
"timeStamp":216694062.0, ),
"pointer":6, const PointerMoveEvent(
"x":208.85714721679688, timeStamp: const Duration(milliseconds: 216694448),
"y":515.1428833007812 pointer: 6,
}, position: const Point(226.2857208251953, 498.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694070.0, timeStamp: const Duration(milliseconds: 216694456),
"pointer":6, pointer: 6,
"x":208.0, position: const Point(226.2857208251953, 498.8571472167969)
"y":501.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694471),
"type":"pointermove", pointer: 6,
"timeStamp":216694077.0, position: const Point(226.2857208251953, 498.28570556640625)
"pointer":6, ),
"x":207.42857360839844, const PointerMoveEvent(
"y":487.1428527832031 timeStamp: const Duration(milliseconds: 216694479),
}, pointer: 6,
{ position: const Point(226.2857208251953, 496.5714416503906)
"type":"pointermove", ),
"timeStamp":216694085.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694486),
"x":206.57142639160156, pointer: 6,
"y":472.8571472167969 position: const Point(226.2857208251953, 493.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694494),
"timeStamp":216694092.0, pointer: 6,
"pointer":6, position: const Point(226.2857208251953, 490.0)
"x":206.57142639160156, ),
"y":458.8571472167969 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694502),
{ pointer: 6,
"type":"pointermove", position: const Point(226.2857208251953, 486.0)
"timeStamp":216694100.0, ),
"pointer":6, const PointerMoveEvent(
"x":206.57142639160156, timeStamp: const Duration(milliseconds: 216694510),
"y":446.0 pointer: 6,
}, position: const Point(226.2857208251953, 480.5714416503906)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694108.0, timeStamp: const Duration(milliseconds: 216694518),
"pointer":6, pointer: 6,
"x":206.57142639160156, position: const Point(226.2857208251953, 475.71429443359375)
"y":434.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694525),
"type":"pointermove", pointer: 6,
"timeStamp":216694116.0, position: const Point(226.2857208251953, 468.8571472167969)
"pointer":6, ),
"x":207.14285278320312, const PointerMoveEvent(
"y":423.71429443359375 timeStamp: const Duration(milliseconds: 216694533),
}, pointer: 6,
{ position: const Point(226.2857208251953, 461.4285583496094)
"type":"pointermove", ),
"timeStamp":216694124.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694541),
"x":208.57142639160156, pointer: 6,
"y":412.8571472167969 position: const Point(226.2857208251953, 452.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694548),
"timeStamp":216694131.0, pointer: 6,
"pointer":6, position: const Point(226.57142639160156, 442.28570556640625)
"x":209.7142791748047, ),
"y":402.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694556),
{ pointer: 6,
"type":"pointermove", position: const Point(226.57142639160156, 432.28570556640625)
"timeStamp":216694139.0, ),
"pointer":6, const PointerMoveEvent(
"x":211.7142791748047, timeStamp: const Duration(milliseconds: 216694564),
"y":393.1428527832031 pointer: 6,
}, position: const Point(226.85714721679688, 423.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694147.0, timeStamp: const Duration(milliseconds: 216694571),
"pointer":6, pointer: 6,
"x":213.42857360839844, position: const Point(227.42857360839844, 416.0)
"y":385.1428527832031 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694580),
"type":"pointermove", pointer: 6,
"timeStamp":216694154.0, position: const Point(227.7142791748047, 410.0)
"pointer":6, ),
"x":215.42857360839844, const PointerMoveEvent(
"y":378.28570556640625 timeStamp: const Duration(milliseconds: 216694587),
}, pointer: 6,
{ position: const Point(228.2857208251953, 404.28570556640625)
"type":"pointermove", ),
"timeStamp":216694162.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694595),
"x":217.42857360839844, pointer: 6,
"y":371.71429443359375 position: const Point(228.85714721679688, 399.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694603),
"timeStamp":216694169.0, pointer: 6,
"pointer":6, position: const Point(229.14285278320312, 395.4285583496094)
"x":219.42857360839844, ),
"y":366.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694610),
{ pointer: 6,
"type":"pointermove", position: const Point(229.42857360839844, 392.28570556640625)
"timeStamp":216694177.0, ),
"pointer":6, const PointerMoveEvent(
"x":221.42857360839844, timeStamp: const Duration(milliseconds: 216694618),
"y":360.8571472167969 pointer: 6,
}, position: const Point(229.7142791748047, 390.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694185.0, timeStamp: const Duration(milliseconds: 216694625),
"pointer":6, pointer: 6,
"x":223.42857360839844, position: const Point(229.7142791748047, 388.0)
"y":356.5714416503906 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694633),
"type":"pointermove", pointer: 6,
"timeStamp":216694193.0, position: const Point(229.7142791748047, 386.8571472167969)
"pointer":6, ),
"x":225.14285278320312, const PointerMoveEvent(
"y":352.28570556640625 timeStamp: const Duration(milliseconds: 216694641),
}, pointer: 6,
{ position: const Point(229.7142791748047, 386.28570556640625)
"type":"pointermove", ),
"timeStamp":216694201.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694648),
"x":226.85714721679688, pointer: 6,
"y":348.5714416503906 position: const Point(229.7142791748047, 386.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694657),
"timeStamp":216694209.0, pointer: 6,
"pointer":6, position: const Point(228.85714721679688, 386.0)
"x":228.2857208251953, ),
"y":346.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694665),
{ pointer: 6,
"type":"pointermove", position: const Point(228.0, 388.0)
"timeStamp":216694216.0, ),
"pointer":6, const PointerMoveEvent(
"x":229.14285278320312, timeStamp: const Duration(milliseconds: 216694672),
"y":343.71429443359375 pointer: 6,
}, position: const Point(226.0, 392.5714416503906)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694224.0, timeStamp: const Duration(milliseconds: 216694680),
"pointer":6, pointer: 6,
"x":230.0, position: const Point(224.0, 397.71429443359375)
"y":342.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694688),
"type":"pointermove", pointer: 6,
"timeStamp":216694232.0, position: const Point(222.0, 404.28570556640625)
"pointer":6, ),
"x":230.57142639160156, const PointerMoveEvent(
"y":340.5714416503906 timeStamp: const Duration(milliseconds: 216694695),
}, pointer: 6,
{ position: const Point(219.7142791748047, 411.1428527832031)
"type":"pointermove", ),
"timeStamp":216694239.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694703),
"x":230.85714721679688, pointer: 6,
"y":339.71429443359375 position: const Point(218.2857208251953, 418.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694710),
"timeStamp":216694247.0, pointer: 6,
"pointer":6, position: const Point(217.14285278320312, 425.4285583496094)
"x":230.85714721679688, ),
"y":339.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694718),
{ pointer: 6,
"type":"pointermove", position: const Point(215.7142791748047, 433.4285583496094)
"timeStamp":216694262.0, ),
"pointer":6, const PointerMoveEvent(
"x":230.2857208251953, timeStamp: const Duration(milliseconds: 216694726),
"y":342.0 pointer: 6,
}, position: const Point(214.85714721679688, 442.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694270.0, timeStamp: const Duration(milliseconds: 216694734),
"pointer":6, pointer: 6,
"x":228.85714721679688, position: const Point(214.0, 454.0)
"y":346.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216694742),
"type":"pointermove", pointer: 6,
"timeStamp":216694278.0, position: const Point(214.0, 469.4285583496094)
"pointer":6, ),
"x":227.14285278320312, const PointerMoveEvent(
"y":352.5714416503906 timeStamp: const Duration(milliseconds: 216694749),
}, pointer: 6,
{ position: const Point(215.42857360839844, 485.4285583496094)
"type":"pointermove", ),
"timeStamp":216694286.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216694757),
"x":225.42857360839844, pointer: 6,
"y":359.4285583496094 position: const Point(217.7142791748047, 502.8571472167969)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216694765),
"timeStamp":216694294.0, pointer: 6,
"pointer":6, position: const Point(221.14285278320312, 521.4285888671875)
"x":223.7142791748047, ),
"y":367.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216694772),
{ pointer: 6,
"type":"pointermove", position: const Point(224.57142639160156, 541.1428833007812)
"timeStamp":216694301.0, ),
"pointer":6, const PointerMoveEvent(
"x":222.57142639160156, timeStamp: const Duration(milliseconds: 216694780),
"y":376.0 pointer: 6,
}, position: const Point(229.14285278320312, 561.1428833007812)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694309.0, timeStamp: const Duration(milliseconds: 216694788),
"pointer":6, pointer: 6,
"x":221.42857360839844, position: const Point(233.42857360839844, 578.8571166992188)
"y":384.28570556640625 ),
}, const PointerUpEvent(
{ timeStamp: const Duration(milliseconds: 216694802),
"type":"pointermove", pointer: 6,
"timeStamp":216694317.0, position: const Point(233.42857360839844, 578.8571166992188)
"pointer":6, ),
"x":220.85714721679688, const PointerDownEvent(
"y":392.28570556640625 timeStamp: const Duration(milliseconds: 216695344),
}, pointer: 7,
{ position: const Point(253.42857360839844, 310.5714416503906)
"type":"pointermove", ),
"timeStamp":216694324.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695352),
"x":220.0, pointer: 7,
"y":400.5714416503906 position: const Point(253.42857360839844, 310.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695359),
"timeStamp":216694332.0, pointer: 7,
"pointer":6, position: const Point(252.85714721679688, 318.0)
"x":219.14285278320312, ),
"y":409.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695367),
{ pointer: 7,
"type":"pointermove", position: const Point(251.14285278320312, 322.0)
"timeStamp":216694339.0, ),
"pointer":6, const PointerMoveEvent(
"x":218.85714721679688, timeStamp: const Duration(milliseconds: 216695375),
"y":419.1428527832031 pointer: 7,
}, position: const Point(248.85714721679688, 327.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694348.0, timeStamp: const Duration(milliseconds: 216695382),
"pointer":6, pointer: 7,
"x":218.2857208251953, position: const Point(246.0, 334.8571472167969)
"y":428.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695390),
"type":"pointermove", pointer: 7,
"timeStamp":216694356.0, position: const Point(242.57142639160156, 344.5714416503906)
"pointer":6, ),
"x":218.2857208251953, const PointerMoveEvent(
"y":438.8571472167969 timeStamp: const Duration(milliseconds: 216695397),
}, pointer: 7,
{ position: const Point(238.85714721679688, 357.4285583496094)
"type":"pointermove", ),
"timeStamp":216694363.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695406),
"x":218.2857208251953, pointer: 7,
"y":447.71429443359375 position: const Point(235.7142791748047, 371.71429443359375)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695414),
"timeStamp":216694371.0, pointer: 7,
"pointer":6, position: const Point(232.2857208251953, 386.8571472167969)
"x":218.2857208251953, ),
"y":455.71429443359375 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695421),
{ pointer: 7,
"type":"pointermove", position: const Point(229.42857360839844, 402.0)
"timeStamp":216694379.0, ),
"pointer":6, const PointerMoveEvent(
"x":219.14285278320312, timeStamp: const Duration(milliseconds: 216695429),
"y":462.8571472167969 pointer: 7,
}, position: const Point(227.42857360839844, 416.8571472167969)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694386.0, timeStamp: const Duration(milliseconds: 216695437),
"pointer":6, pointer: 7,
"x":220.0, position: const Point(226.2857208251953, 431.4285583496094)
"y":469.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695444),
"type":"pointermove", pointer: 7,
"timeStamp":216694394.0, position: const Point(226.2857208251953, 446.0)
"pointer":6, ),
"x":221.14285278320312, const PointerMoveEvent(
"y":475.4285583496094 timeStamp: const Duration(milliseconds: 216695452),
}, pointer: 7,
{ position: const Point(227.7142791748047, 460.28570556640625)
"type":"pointermove", ),
"timeStamp":216694401.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695459),
"x":222.0, pointer: 7,
"y":480.5714416503906 position: const Point(230.0, 475.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695467),
"timeStamp":216694409.0, pointer: 7,
"pointer":6, position: const Point(232.2857208251953, 489.71429443359375)
"x":222.85714721679688, ),
"y":485.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695475),
{ pointer: 7,
"type":"pointermove", position: const Point(235.7142791748047, 504.0)
"timeStamp":216694417.0, ),
"pointer":6, const PointerUpEvent(
"x":224.0, timeStamp: const Duration(milliseconds: 216695490),
"y":489.71429443359375 pointer: 7,
}, position: const Point(235.7142791748047, 504.0)
{ ),
"type":"pointermove", const PointerDownEvent(
"timeStamp":216694425.0, timeStamp: const Duration(milliseconds: 216695885),
"pointer":6, pointer: 8,
"x":224.85714721679688, position: const Point(238.85714721679688, 524.0)
"y":492.8571472167969 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695908),
"type":"pointermove", pointer: 8,
"timeStamp":216694433.0, position: const Point(236.2857208251953, 515.7142944335938)
"pointer":6, ),
"x":225.42857360839844, const PointerMoveEvent(
"y":495.4285583496094 timeStamp: const Duration(milliseconds: 216695916),
}, pointer: 8,
{ position: const Point(234.85714721679688, 509.1428527832031)
"type":"pointermove", ),
"timeStamp":216694440.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695924),
"x":226.0, pointer: 8,
"y":497.1428527832031 position: const Point(232.57142639160156, 498.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695931),
"timeStamp":216694448.0, pointer: 8,
"pointer":6, position: const Point(230.57142639160156, 483.71429443359375)
"x":226.2857208251953, ),
"y":498.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216695939),
{ pointer: 8,
"type":"pointermove", position: const Point(229.14285278320312, 466.5714416503906)
"timeStamp":216694456.0, ),
"pointer":6, const PointerMoveEvent(
"x":226.2857208251953, timeStamp: const Duration(milliseconds: 216695947),
"y":498.8571472167969 pointer: 8,
}, position: const Point(229.14285278320312, 446.5714416503906)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694471.0, timeStamp: const Duration(milliseconds: 216695955),
"pointer":6, pointer: 8,
"x":226.2857208251953, position: const Point(230.57142639160156, 424.8571472167969)
"y":498.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216695963),
"type":"pointermove", pointer: 8,
"timeStamp":216694479.0, position: const Point(232.57142639160156, 402.28570556640625)
"pointer":6, ),
"x":226.2857208251953, const PointerMoveEvent(
"y":496.5714416503906 timeStamp: const Duration(milliseconds: 216695970),
}, pointer: 8,
{ position: const Point(235.14285278320312, 380.0)
"type":"pointermove", ),
"timeStamp":216694486.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216695978),
"x":226.2857208251953, pointer: 8,
"y":493.71429443359375 position: const Point(238.57142639160156, 359.4285583496094)
}, ),
{ const PointerUpEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216695993),
"timeStamp":216694494.0, pointer: 8,
"pointer":6, position: const Point(238.57142639160156, 359.4285583496094)
"x":226.2857208251953, ),
"y":490.0 const PointerDownEvent(
}, timeStamp: const Duration(milliseconds: 216696429),
{ pointer: 9,
"type":"pointermove", position: const Point(238.2857208251953, 568.5714111328125)
"timeStamp":216694502.0, ),
"pointer":6, const PointerMoveEvent(
"x":226.2857208251953, timeStamp: const Duration(milliseconds: 216696459),
"y":486.0 pointer: 9,
}, position: const Point(234.0, 560.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694510.0, timeStamp: const Duration(milliseconds: 216696467),
"pointer":6, pointer: 9,
"x":226.2857208251953, position: const Point(231.42857360839844, 553.1428833007812)
"y":480.5714416503906 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216696475),
"type":"pointermove", pointer: 9,
"timeStamp":216694518.0, position: const Point(228.2857208251953, 543.1428833007812)
"pointer":6, ),
"x":226.2857208251953, const PointerMoveEvent(
"y":475.71429443359375 timeStamp: const Duration(milliseconds: 216696483),
}, pointer: 9,
{ position: const Point(225.42857360839844, 528.8571166992188)
"type":"pointermove", ),
"timeStamp":216694525.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216696491),
"x":226.2857208251953, pointer: 9,
"y":468.8571472167969 position: const Point(223.14285278320312, 512.2857055664062)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216696498),
"timeStamp":216694533.0, pointer: 9,
"pointer":6, position: const Point(222.0, 495.4285583496094)
"x":226.2857208251953, ),
"y":461.4285583496094 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216696506),
{ pointer: 9,
"type":"pointermove", position: const Point(221.7142791748047, 477.4285583496094)
"timeStamp":216694541.0, ),
"pointer":6, const PointerMoveEvent(
"x":226.2857208251953, timeStamp: const Duration(milliseconds: 216696514),
"y":452.5714416503906 pointer: 9,
}, position: const Point(221.7142791748047, 458.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694548.0, timeStamp: const Duration(milliseconds: 216696521),
"pointer":6, pointer: 9,
"x":226.57142639160156, position: const Point(223.14285278320312, 438.0)
"y":442.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216696529),
"type":"pointermove", pointer: 9,
"timeStamp":216694556.0, position: const Point(224.2857208251953, 416.28570556640625)
"pointer":6, ),
"x":226.57142639160156, const PointerUpEvent(
"y":432.28570556640625 timeStamp: const Duration(milliseconds: 216696544),
}, pointer: 9,
{ position: const Point(224.2857208251953, 416.28570556640625)
"type":"pointermove", ),
"timeStamp":216694564.0, const PointerDownEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216696974),
"x":226.85714721679688, pointer: 10,
"y":423.4285583496094 position: const Point(218.57142639160156, 530.5714111328125)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697012),
"timeStamp":216694571.0, pointer: 10,
"pointer":6, position: const Point(220.2857208251953, 522.0)
"x":227.42857360839844, ),
"y":416.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216697020),
{ pointer: 10,
"type":"pointermove", position: const Point(221.14285278320312, 517.7142944335938)
"timeStamp":216694580.0, ),
"pointer":6, const PointerMoveEvent(
"x":227.7142791748047, timeStamp: const Duration(milliseconds: 216697028),
"y":410.0 pointer: 10,
}, position: const Point(222.2857208251953, 511.71429443359375)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694587.0, timeStamp: const Duration(milliseconds: 216697036),
"pointer":6, pointer: 10,
"x":228.2857208251953, position: const Point(224.0, 504.28570556640625)
"y":404.28570556640625 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697044),
"type":"pointermove", pointer: 10,
"timeStamp":216694595.0, position: const Point(227.14285278320312, 490.5714416503906)
"pointer":6, ),
"x":228.85714721679688, const PointerMoveEvent(
"y":399.71429443359375 timeStamp: const Duration(milliseconds: 216697052),
}, pointer: 10,
{ position: const Point(229.42857360839844, 474.0)
"type":"pointermove", ),
"timeStamp":216694603.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697059),
"x":229.14285278320312, pointer: 10,
"y":395.4285583496094 position: const Point(231.42857360839844, 454.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697067),
"timeStamp":216694610.0, pointer: 10,
"pointer":6, position: const Point(233.7142791748047, 431.1428527832031)
"x":229.42857360839844, ),
"y":392.28570556640625 const PointerUpEvent(
}, timeStamp: const Duration(milliseconds: 216697082),
{ pointer: 10,
"type":"pointermove", position: const Point(233.7142791748047, 431.1428527832031)
"timeStamp":216694618.0, ),
"pointer":6, const PointerDownEvent(
"x":229.7142791748047, timeStamp: const Duration(milliseconds: 216697435),
"y":390.0 pointer: 11,
}, position: const Point(257.1428527832031, 285.1428527832031)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694625.0, timeStamp: const Duration(milliseconds: 216697465),
"pointer":6, pointer: 11,
"x":229.7142791748047, position: const Point(251.7142791748047, 296.8571472167969)
"y":388.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697473),
"type":"pointermove", pointer: 11,
"timeStamp":216694633.0, position: const Point(248.2857208251953, 304.0)
"pointer":6, ),
"x":229.7142791748047, const PointerMoveEvent(
"y":386.8571472167969 timeStamp: const Duration(milliseconds: 216697481),
}, pointer: 11,
{ position: const Point(244.57142639160156, 314.8571472167969)
"type":"pointermove", ),
"timeStamp":216694641.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697489),
"x":229.7142791748047, pointer: 11,
"y":386.28570556640625 position: const Point(240.2857208251953, 329.1428527832031)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697497),
"timeStamp":216694648.0, pointer: 11,
"pointer":6, position: const Point(236.85714721679688, 345.1428527832031)
"x":229.7142791748047, ),
"y":386.0 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216697505),
{ pointer: 11,
"type":"pointermove", position: const Point(233.7142791748047, 361.4285583496094)
"timeStamp":216694657.0, ),
"pointer":6, const PointerMoveEvent(
"x":228.85714721679688, timeStamp: const Duration(milliseconds: 216697512),
"y":386.0 pointer: 11,
}, position: const Point(231.14285278320312, 378.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694665.0, timeStamp: const Duration(milliseconds: 216697520),
"pointer":6, pointer: 11,
"x":228.0, position: const Point(229.42857360839844, 395.4285583496094)
"y":388.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697528),
"type":"pointermove", pointer: 11,
"timeStamp":216694672.0, position: const Point(229.42857360839844, 412.8571472167969)
"pointer":6, ),
"x":226.0, const PointerMoveEvent(
"y":392.5714416503906 timeStamp: const Duration(milliseconds: 216697535),
}, pointer: 11,
{ position: const Point(230.85714721679688, 430.8571472167969)
"type":"pointermove", ),
"timeStamp":216694680.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697543),
"x":224.0, pointer: 11,
"y":397.71429443359375 position: const Point(233.42857360839844, 449.71429443359375)
}, ),
{ const PointerUpEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697558),
"timeStamp":216694688.0, pointer: 11,
"pointer":6, position: const Point(233.42857360839844, 449.71429443359375)
"x":222.0, ),
"y":404.28570556640625 const PointerDownEvent(
}, timeStamp: const Duration(milliseconds: 216697749),
{ pointer: 12,
"type":"pointermove", position: const Point(246.0, 311.4285583496094)
"timeStamp":216694695.0, ),
"pointer":6, const PointerMoveEvent(
"x":219.7142791748047, timeStamp: const Duration(milliseconds: 216697780),
"y":411.1428527832031 pointer: 12,
}, position: const Point(244.57142639160156, 318.28570556640625)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694703.0, timeStamp: const Duration(milliseconds: 216697787),
"pointer":6, pointer: 12,
"x":218.2857208251953, position: const Point(243.14285278320312, 325.4285583496094)
"y":418.0 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697795),
"type":"pointermove", pointer: 12,
"timeStamp":216694710.0, position: const Point(241.42857360839844, 336.0)
"pointer":6, ),
"x":217.14285278320312, const PointerMoveEvent(
"y":425.4285583496094 timeStamp: const Duration(milliseconds: 216697803),
}, pointer: 12,
{ position: const Point(239.7142791748047, 351.1428527832031)
"type":"pointermove", ),
"timeStamp":216694718.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216697811),
"x":215.7142791748047, pointer: 12,
"y":433.4285583496094 position: const Point(238.2857208251953, 368.5714416503906)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216697819),
"timeStamp":216694726.0, pointer: 12,
"pointer":6, position: const Point(238.0, 389.4285583496094)
"x":214.85714721679688, ),
"y":442.28570556640625 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216697826),
{ pointer: 12,
"type":"pointermove", position: const Point(239.14285278320312, 412.0)
"timeStamp":216694734.0, ),
"pointer":6, const PointerMoveEvent(
"x":214.0, timeStamp: const Duration(milliseconds: 216697834),
"y":454.0 pointer: 12,
}, position: const Point(242.2857208251953, 438.0)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694742.0, timeStamp: const Duration(milliseconds: 216697842),
"pointer":6, pointer: 12,
"x":214.0, position: const Point(247.42857360839844, 466.8571472167969)
"y":469.4285583496094 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216697849),
"type":"pointermove", pointer: 12,
"timeStamp":216694749.0, position: const Point(254.2857208251953, 497.71429443359375)
"pointer":6, ),
"x":215.42857360839844, const PointerUpEvent(
"y":485.4285583496094 timeStamp: const Duration(milliseconds: 216697864),
}, pointer: 12,
{ position: const Point(254.2857208251953, 497.71429443359375)
"type":"pointermove", ),
"timeStamp":216694757.0, const PointerDownEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216698321),
"x":217.7142791748047, pointer: 13,
"y":502.8571472167969 position: const Point(250.0, 306.0)
}, ),
{ const PointerMoveEvent(
"type":"pointermove", timeStamp: const Duration(milliseconds: 216698328),
"timeStamp":216694765.0, pointer: 13,
"pointer":6, position: const Point(250.0, 306.0)
"x":221.14285278320312, ),
"y":521.4285888671875 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216698344),
{ pointer: 13,
"type":"pointermove", position: const Point(249.14285278320312, 314.0)
"timeStamp":216694772.0, ),
"pointer":6, const PointerMoveEvent(
"x":224.57142639160156, timeStamp: const Duration(milliseconds: 216698351),
"y":541.1428833007812 pointer: 13,
}, position: const Point(247.42857360839844, 319.4285583496094)
{ ),
"type":"pointermove", const PointerMoveEvent(
"timeStamp":216694780.0, timeStamp: const Duration(milliseconds: 216698359),
"pointer":6, pointer: 13,
"x":229.14285278320312, position: const Point(245.14285278320312, 326.8571472167969)
"y":561.1428833007812 ),
}, const PointerMoveEvent(
{ timeStamp: const Duration(milliseconds: 216698366),
"type":"pointermove", pointer: 13,
"timeStamp":216694788.0, position: const Point(241.7142791748047, 339.4285583496094)
"pointer":6, ),
"x":233.42857360839844, const PointerMoveEvent(
"y":578.8571166992188 timeStamp: const Duration(milliseconds: 216698374),
}, pointer: 13,
{ position: const Point(238.57142639160156, 355.71429443359375)
"type":"pointerup", ),
"timeStamp":216694802.0, const PointerMoveEvent(
"pointer":6, timeStamp: const Duration(milliseconds: 216698382),
"x":233.42857360839844, pointer: 13,
"y":578.8571166992188 position: const Point(236.2857208251953, 374.28570556640625)
}, ),
{ const PointerMoveEvent(
"type":"pointerdown", timeStamp: const Duration(milliseconds: 216698390),
"timeStamp":216695344.0, pointer: 13,
"pointer":7, position: const Point(235.14285278320312, 396.5714416503906)
"x":253.42857360839844, ),
"y":310.5714416503906 const PointerMoveEvent(
}, timeStamp: const Duration(milliseconds: 216698398),
{ pointer: 13,
"type":"pointermove", position: const Point(236.57142639160156, 421.4285583496094)
"timeStamp":216695352.0, ),
"pointer":7, const PointerMoveEvent(
"x":253.42857360839844, timeStamp: const Duration(milliseconds: 216698406),
"y":310.5714416503906 pointer: 13,
}, position: const Point(241.14285278320312, 451.4285583496094)
{ ),
"type":"pointermove", const PointerUpEvent(
"timeStamp":216695359.0, timeStamp: const Duration(milliseconds: 216698421),
"pointer":7, pointer: 13,
"x":252.85714721679688, position: const Point(241.14285278320312, 451.4285583496094)
"y":318.0 ),
},
{
"type":"pointermove",
"timeStamp":216695367.0,
"pointer":7,
"x":251.14285278320312,
"y":322.0
},
{
"type":"pointermove",
"timeStamp":216695375.0,
"pointer":7,
"x":248.85714721679688,
"y":327.1428527832031
},
{
"type":"pointermove",
"timeStamp":216695382.0,
"pointer":7,
"x":246.0,
"y":334.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695390.0,
"pointer":7,
"x":242.57142639160156,
"y":344.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695397.0,
"pointer":7,
"x":238.85714721679688,
"y":357.4285583496094
},
{
"type":"pointermove",
"timeStamp":216695406.0,
"pointer":7,
"x":235.7142791748047,
"y":371.71429443359375
},
{
"type":"pointermove",
"timeStamp":216695414.0,
"pointer":7,
"x":232.2857208251953,
"y":386.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695421.0,
"pointer":7,
"x":229.42857360839844,
"y":402.0
},
{
"type":"pointermove",
"timeStamp":216695429.0,
"pointer":7,
"x":227.42857360839844,
"y":416.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695437.0,
"pointer":7,
"x":226.2857208251953,
"y":431.4285583496094
},
{
"type":"pointermove",
"timeStamp":216695444.0,
"pointer":7,
"x":226.2857208251953,
"y":446.0
},
{
"type":"pointermove",
"timeStamp":216695452.0,
"pointer":7,
"x":227.7142791748047,
"y":460.28570556640625
},
{
"type":"pointermove",
"timeStamp":216695459.0,
"pointer":7,
"x":230.0,
"y":475.1428527832031
},
{
"type":"pointermove",
"timeStamp":216695467.0,
"pointer":7,
"x":232.2857208251953,
"y":489.71429443359375
},
{
"type":"pointermove",
"timeStamp":216695475.0,
"pointer":7,
"x":235.7142791748047,
"y":504.0
},
{
"type":"pointerup",
"timeStamp":216695490.0,
"pointer":7,
"x":235.7142791748047,
"y":504.0
},
{
"type":"pointerdown",
"timeStamp":216695885.0,
"pointer":8,
"x":238.85714721679688,
"y":524.0
},
{
"type":"pointermove",
"timeStamp":216695908.0,
"pointer":8,
"x":236.2857208251953,
"y":515.7142944335938
},
{
"type":"pointermove",
"timeStamp":216695916.0,
"pointer":8,
"x":234.85714721679688,
"y":509.1428527832031
},
{
"type":"pointermove",
"timeStamp":216695924.0,
"pointer":8,
"x":232.57142639160156,
"y":498.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695931.0,
"pointer":8,
"x":230.57142639160156,
"y":483.71429443359375
},
{
"type":"pointermove",
"timeStamp":216695939.0,
"pointer":8,
"x":229.14285278320312,
"y":466.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695947.0,
"pointer":8,
"x":229.14285278320312,
"y":446.5714416503906
},
{
"type":"pointermove",
"timeStamp":216695955.0,
"pointer":8,
"x":230.57142639160156,
"y":424.8571472167969
},
{
"type":"pointermove",
"timeStamp":216695963.0,
"pointer":8,
"x":232.57142639160156,
"y":402.28570556640625
},
{
"type":"pointermove",
"timeStamp":216695970.0,
"pointer":8,
"x":235.14285278320312,
"y":380.0
},
{
"type":"pointermove",
"timeStamp":216695978.0,
"pointer":8,
"x":238.57142639160156,
"y":359.4285583496094
},
{
"type":"pointerup",
"timeStamp":216695993.0,
"pointer":8,
"x":238.57142639160156,
"y":359.4285583496094
},
{
"type":"pointerdown",
"timeStamp":216696429.0,
"pointer":9,
"x":238.2857208251953,
"y":568.5714111328125
},
{
"type":"pointermove",
"timeStamp":216696459.0,
"pointer":9,
"x":234.0,
"y":560.0
},
{
"type":"pointermove",
"timeStamp":216696467.0,
"pointer":9,
"x":231.42857360839844,
"y":553.1428833007812
},
{
"type":"pointermove",
"timeStamp":216696475.0,
"pointer":9,
"x":228.2857208251953,
"y":543.1428833007812
},
{
"type":"pointermove",
"timeStamp":216696483.0,
"pointer":9,
"x":225.42857360839844,
"y":528.8571166992188
},
{
"type":"pointermove",
"timeStamp":216696491.0,
"pointer":9,
"x":223.14285278320312,
"y":512.2857055664062
},
{
"type":"pointermove",
"timeStamp":216696498.0,
"pointer":9,
"x":222.0,
"y":495.4285583496094
},
{
"type":"pointermove",
"timeStamp":216696506.0,
"pointer":9,
"x":221.7142791748047,
"y":477.4285583496094
},
{
"type":"pointermove",
"timeStamp":216696514.0,
"pointer":9,
"x":221.7142791748047,
"y":458.28570556640625
},
{
"type":"pointermove",
"timeStamp":216696521.0,
"pointer":9,
"x":223.14285278320312,
"y":438.0
},
{
"type":"pointermove",
"timeStamp":216696529.0,
"pointer":9,
"x":224.2857208251953,
"y":416.28570556640625
},
{
"type":"pointerup",
"timeStamp":216696544.0,
"pointer":9,
"x":224.2857208251953,
"y":416.28570556640625
},
{
"type":"pointerdown",
"timeStamp":216696974.0,
"pointer":10,
"x":218.57142639160156,
"y":530.5714111328125
},
{
"type":"pointermove",
"timeStamp":216697012.0,
"pointer":10,
"x":220.2857208251953,
"y":522.0
},
{
"type":"pointermove",
"timeStamp":216697020.0,
"pointer":10,
"x":221.14285278320312,
"y":517.7142944335938
},
{
"type":"pointermove",
"timeStamp":216697028.0,
"pointer":10,
"x":222.2857208251953,
"y":511.71429443359375
},
{
"type":"pointermove",
"timeStamp":216697036.0,
"pointer":10,
"x":224.0,
"y":504.28570556640625
},
{
"type":"pointermove",
"timeStamp":216697044.0,
"pointer":10,
"x":227.14285278320312,
"y":490.5714416503906
},
{
"type":"pointermove",
"timeStamp":216697052.0,
"pointer":10,
"x":229.42857360839844,
"y":474.0
},
{
"type":"pointermove",
"timeStamp":216697059.0,
"pointer":10,
"x":231.42857360839844,
"y":454.5714416503906
},
{
"type":"pointermove",
"timeStamp":216697067.0,
"pointer":10,
"x":233.7142791748047,
"y":431.1428527832031
},
{
"type":"pointerup",
"timeStamp":216697082.0,
"pointer":10,
"x":233.7142791748047,
"y":431.1428527832031
},
{
"type":"pointerdown",
"timeStamp":216697435.0,
"pointer":11,
"x":257.1428527832031,
"y":285.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697465.0,
"pointer":11,
"x":251.7142791748047,
"y":296.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697473.0,
"pointer":11,
"x":248.2857208251953,
"y":304.0
},
{
"type":"pointermove",
"timeStamp":216697481.0,
"pointer":11,
"x":244.57142639160156,
"y":314.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697489.0,
"pointer":11,
"x":240.2857208251953,
"y":329.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697497.0,
"pointer":11,
"x":236.85714721679688,
"y":345.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697505.0,
"pointer":11,
"x":233.7142791748047,
"y":361.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697512.0,
"pointer":11,
"x":231.14285278320312,
"y":378.28570556640625
},
{
"type":"pointermove",
"timeStamp":216697520.0,
"pointer":11,
"x":229.42857360839844,
"y":395.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697528.0,
"pointer":11,
"x":229.42857360839844,
"y":412.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697535.0,
"pointer":11,
"x":230.85714721679688,
"y":430.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697543.0,
"pointer":11,
"x":233.42857360839844,
"y":449.71429443359375
},
{
"type":"pointerup",
"timeStamp":216697558.0,
"pointer":11,
"x":233.42857360839844,
"y":449.71429443359375
},
{
"type":"pointerdown",
"timeStamp":216697749.0,
"pointer":12,
"x":246.0,
"y":311.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697780.0,
"pointer":12,
"x":244.57142639160156,
"y":318.28570556640625
},
{
"type":"pointermove",
"timeStamp":216697787.0,
"pointer":12,
"x":243.14285278320312,
"y":325.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697795.0,
"pointer":12,
"x":241.42857360839844,
"y":336.0
},
{
"type":"pointermove",
"timeStamp":216697803.0,
"pointer":12,
"x":239.7142791748047,
"y":351.1428527832031
},
{
"type":"pointermove",
"timeStamp":216697811.0,
"pointer":12,
"x":238.2857208251953,
"y":368.5714416503906
},
{
"type":"pointermove",
"timeStamp":216697819.0,
"pointer":12,
"x":238.0,
"y":389.4285583496094
},
{
"type":"pointermove",
"timeStamp":216697826.0,
"pointer":12,
"x":239.14285278320312,
"y":412.0
},
{
"type":"pointermove",
"timeStamp":216697834.0,
"pointer":12,
"x":242.2857208251953,
"y":438.0
},
{
"type":"pointermove",
"timeStamp":216697842.0,
"pointer":12,
"x":247.42857360839844,
"y":466.8571472167969
},
{
"type":"pointermove",
"timeStamp":216697849.0,
"pointer":12,
"x":254.2857208251953,
"y":497.71429443359375
},
{
"type":"pointerup",
"timeStamp":216697864.0,
"pointer":12,
"x":254.2857208251953,
"y":497.71429443359375
},
{
"type":"pointerdown",
"timeStamp":216698321.0,
"pointer":13,
"x":250.0,
"y":306.0
},
{
"type":"pointermove",
"timeStamp":216698328.0,
"pointer":13,
"x":250.0,
"y":306.0
},
{
"type":"pointermove",
"timeStamp":216698344.0,
"pointer":13,
"x":249.14285278320312,
"y":314.0
},
{
"type":"pointermove",
"timeStamp":216698351.0,
"pointer":13,
"x":247.42857360839844,
"y":319.4285583496094
},
{
"type":"pointermove",
"timeStamp":216698359.0,
"pointer":13,
"x":245.14285278320312,
"y":326.8571472167969
},
{
"type":"pointermove",
"timeStamp":216698366.0,
"pointer":13,
"x":241.7142791748047,
"y":339.4285583496094
},
{
"type":"pointermove",
"timeStamp":216698374.0,
"pointer":13,
"x":238.57142639160156,
"y":355.71429443359375
},
{
"type":"pointermove",
"timeStamp":216698382.0,
"pointer":13,
"x":236.2857208251953,
"y":374.28570556640625
},
{
"type":"pointermove",
"timeStamp":216698390.0,
"pointer":13,
"x":235.14285278320312,
"y":396.5714416503906
},
{
"type":"pointermove",
"timeStamp":216698398.0,
"pointer":13,
"x":236.57142639160156,
"y":421.4285583496094
},
{
"type":"pointermove",
"timeStamp":216698406.0,
"pointer":13,
"x":241.14285278320312,
"y":451.4285583496094
},
{
"type":"pointerup",
"timeStamp":216698421.0,
"pointer":13,
"x":241.14285278320312,
"y":451.4285583496094
}
]; ];
...@@ -8,56 +8,38 @@ bool _withinTolerance(double actual, double expected) { ...@@ -8,56 +8,38 @@ bool _withinTolerance(double actual, double expected) {
return diff.abs() < kTolerance; return diff.abs() < kTolerance;
} }
bool _checkVelocity(GestureVelocity actual, GestureVelocity expected) { bool _checkVelocity(Offset actual, Offset expected) {
return (actual.isValid == expected.isValid) && return (actual != null)
_withinTolerance(actual.x, expected.x) && && _withinTolerance(actual.dx, expected.dx)
_withinTolerance(actual.y, expected.y); && _withinTolerance(actual.dy, expected.dy);
}
List<PointerInputEvent> _eventFromMap(List<Map> intermediate) {
List<PointerInputEvent> events = new List<PointerInputEvent>();
for (Map entry in intermediate)
events.add(_eventFor(entry));
return events;
}
PointerInputEvent _eventFor(Map entry) {
PointerInputEvent result = new PointerInputEvent(
type: entry['type'],
timeStamp: new Duration(milliseconds: entry['timeStamp'].round()),
pointer: entry['pointer'],
x: entry['x'],
y: entry['y']
);
return result;
} }
void main() { void main() {
List<PointerInputEvent> events = _eventFromMap(velocityEventData); List<Offset> expected = const <Offset>[
const Offset(219.5762939453125, 1304.6705322265625),
List<GestureVelocity> expected = new List<GestureVelocity>(13); const Offset(355.6900939941406, 967.1700439453125),
expected[0] = new GestureVelocity(isValid: true, x: 219.5762939453125, y: 1304.6705322265625); const Offset(12.651158332824707, -36.9227180480957),
expected[1] = new GestureVelocity(isValid: true, x: 355.6900939941406, y: 967.1700439453125); const Offset(714.1383056640625, -2561.540283203125),
expected[2] = new GestureVelocity(isValid: true, x: 12.651158332824707, y: -36.9227180480957); const Offset(-19.658065795898438, -2910.080322265625),
expected[3] = new GestureVelocity(isValid: true, x: 714.1383056640625, y: -2561.540283203125); const Offset(646.8700561523438, 2976.982421875),
expected[4] = new GestureVelocity(isValid: true, x: -19.658065795898438, y: -2910.080322265625); const Offset(396.6878967285156, 2106.204833984375),
expected[5] = new GestureVelocity(isValid: true, x: 646.8700561523438, y: 2976.982421875); const Offset(298.3150634765625, -3660.821044921875),
expected[6] = new GestureVelocity(isValid: true, x: 396.6878967285156, y: 2106.204833984375); const Offset(-1.7460877895355225, -3288.16162109375),
expected[7] = new GestureVelocity(isValid: true, x: 298.3150634765625, y: -3660.821044921875); const Offset(384.6415710449219, -2645.6484375),
expected[8] = new GestureVelocity(isValid: true, x: -1.7460877895355225, y: -3288.16162109375); const Offset(176.3752899169922, 2711.24609375),
expected[9] = new GestureVelocity(isValid: true, x: 384.6415710449219, y: -2645.6484375); const Offset(396.9254455566406, 4280.640625),
expected[10] = new GestureVelocity(isValid: true, x: 176.3752899169922, y: 2711.24609375); const Offset(-71.51288604736328, 3716.74560546875),
expected[11] = new GestureVelocity(isValid: true, x: 396.9254455566406, y: 4280.640625); ];
expected[12] = new GestureVelocity(isValid: true, x: -71.51288604736328, y: 3716.74560546875);
test('Velocity tracker gives expected results', () { test('Velocity tracker gives expected results', () {
VelocityTracker tracker = new VelocityTracker(); VelocityTracker tracker = new VelocityTracker();
int i = 0; int i = 0;
for (PointerInputEvent event in events) { for (PointerEvent event in velocityEventData) {
if (event.type == 'pointerdown' || event.type == 'pointermove') if (event is PointerDownEvent || event is PointerMoveEvent)
tracker.addPosition(event.timeStamp, event.x, event.y); tracker.addPosition(event.timeStamp, event.position);
if (event.type == 'pointerup') { if (event is PointerUpEvent) {
_checkVelocity(tracker.getVelocity(), expected[i++]); _checkVelocity(tracker.getVelocity(), expected[i]);
i += 1;
} }
} }
}); });
......
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