fix resampling leads to Hard to tap (#81022)

* fix PointerUpEvent conversion PointerMoveEvent needs to use the default buttons value.(#73286)

* feat PointerMoveEvent conversion adds test cases

* fix event conversion may modify the original buttons value.

* Update packages/flutter/lib/src/gestures/resampler.dart

Co-authored-by: David Reveman <dreveman@gmail.com>
This commit is contained in:
leo 2021-04-28 23:34:28 +08:00 committed by GitHub
parent 275ba5e3c8
commit 8ddfc80c7f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 5 deletions

View File

@ -42,12 +42,14 @@ class PointerEventResampler {
bool _isTracked = false;
bool _isDown = false;
int _pointerIdentifier = 0;
int _hasButtons = 0;
PointerEvent _toHoverEvent(
PointerEvent event,
Offset position,
Offset delta,
Duration timeStamp,
int buttons,
) {
return PointerHoverEvent(
timeStamp: timeStamp,
@ -79,6 +81,7 @@ class PointerEventResampler {
Offset delta,
int pointerIdentifier,
Duration timeStamp,
int buttons,
) {
return PointerMoveEvent(
timeStamp: timeStamp,
@ -87,7 +90,7 @@ class PointerEventResampler {
device: event.device,
position: position,
delta: delta,
buttons: event.buttons,
buttons: buttons,
obscured: event.obscured,
pressure: event.pressure,
pressureMin: event.pressureMin,
@ -113,9 +116,12 @@ class PointerEventResampler {
int pointerIdentifier,
Duration timeStamp,
bool isDown,
int buttons,
) {
return isDown ? _toMoveEvent(event, position, delta, pointerIdentifier, timeStamp)
: _toHoverEvent(event, position, delta, timeStamp);
return isDown
? _toMoveEvent(
event, position, delta, pointerIdentifier, timeStamp, buttons)
: _toHoverEvent(event, position, delta, timeStamp, buttons);
}
Offset _positionAt(Duration sampleTime) {
@ -205,10 +211,12 @@ class PointerEventResampler {
final bool wasTracked = _isTracked;
final bool wasDown = _isDown;
final int hadButtons = _hasButtons;
// Update pointer state.
_isTracked = event is! PointerRemovedEvent;
_isDown = event.down;
_hasButtons = event.buttons;
// Position at `sampleTime`.
final Offset position = _positionAt(sampleTime);
@ -235,7 +243,8 @@ class PointerEventResampler {
// therefor never produce `hover` events.
if (position != _position) {
final Offset delta = position - _position;
callback(_toMoveOrHoverEvent(event, position, delta, _pointerIdentifier, sampleTime, wasDown));
callback(_toMoveOrHoverEvent(event, position, delta,
_pointerIdentifier, sampleTime, wasDown, hadButtons));
_position = position;
}
callback(event.copyWith(
@ -261,7 +270,8 @@ class PointerEventResampler {
final PointerEvent? next = _next;
if (position != _position && next != null) {
final Offset delta = position - _position;
callback(_toMoveOrHoverEvent(next, position, delta, _pointerIdentifier, sampleTime, _isDown));
callback(_toMoveOrHoverEvent(next, position, delta, _pointerIdentifier,
sampleTime, _isDown, _hasButtons));
_position = position;
}
}

View File

@ -153,6 +153,8 @@ void main() {
expect(result[4].position.dy, 15.0);
expect(result[4].delta.dx, 10.0);
expect(result[4].delta.dy, -10.0);
// buttons field needs to be a valid value
expect(result[4].buttons, kPrimaryButton);
expect(result[5].timeStamp, const Duration(microseconds: 4500));
expect(result[5] is PointerUpEvent, true);
expect(result[5].position.dx, 35.0);