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