Skip to content

Commit c7b10a2

Browse files
authored
Propagate pointer size from Android MotionEvent. (#23536)
1 parent 709f54f commit c7b10a2

5 files changed

Lines changed: 31 additions & 12 deletions

File tree

bin/internal/engine.version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
9c46333e143bb7f0823358811da8ee96e1c13e55
1+
dd791f36aca8fc6f13d6e2fa60f20d4ebea89825

dev/integration_tests/android_views/lib/motion_event_diff.dart

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -122,11 +122,7 @@ void diffPointerCoordsList(StringBuffer diffBuffer,
122122

123123
void diffPointerCoords(Map<String, dynamic> expected,
124124
Map<String, dynamic> actual, int pointerIdx, StringBuffer diffBuffer) {
125-
diffMaps(expected, actual, diffBuffer,
126-
messagePrefix: '[pointerCoord $pointerIdx] ',
127-
excludeKeys: <String>[
128-
'size', // Currently the framework doesn't get the size from the engine.
129-
]);
125+
diffMaps(expected, actual, diffBuffer, messagePrefix: '[pointerCoord $pointerIdx] ');
130126
}
131127

132128
void diffMaps(

packages/flutter/lib/src/gestures/converter.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,7 @@ class PointerEventConverter {
127127
pressureMax: datum.pressureMax,
128128
distance: datum.distance,
129129
distanceMax: datum.distanceMax,
130+
size: datum.size,
130131
radiusMajor: radiusMajor,
131132
radiusMinor: radiusMinor,
132133
radiusMin: radiusMin,
@@ -176,6 +177,7 @@ class PointerEventConverter {
176177
pressureMax: datum.pressureMax,
177178
distance: datum.distance,
178179
distanceMax: datum.distanceMax,
180+
size: datum.size,
179181
radiusMajor: radiusMajor,
180182
radiusMinor: radiusMinor,
181183
radiusMin: radiusMin,
@@ -200,6 +202,7 @@ class PointerEventConverter {
200202
pressureMin: datum.pressureMin,
201203
pressureMax: datum.pressureMax,
202204
distanceMax: datum.distanceMax,
205+
size: datum.size,
203206
radiusMajor: radiusMajor,
204207
radiusMinor: radiusMinor,
205208
radiusMin: radiusMin,
@@ -230,6 +233,7 @@ class PointerEventConverter {
230233
pressureMin: datum.pressureMin,
231234
pressureMax: datum.pressureMax,
232235
distanceMax: datum.distanceMax,
236+
size: datum.size,
233237
radiusMajor: radiusMajor,
234238
radiusMinor: radiusMinor,
235239
radiusMin: radiusMin,
@@ -264,6 +268,7 @@ class PointerEventConverter {
264268
pressureMin: datum.pressureMin,
265269
pressureMax: datum.pressureMax,
266270
distanceMax: datum.distanceMax,
271+
size: datum.size,
267272
radiusMajor: radiusMajor,
268273
radiusMinor: radiusMinor,
269274
radiusMin: radiusMin,
@@ -290,6 +295,7 @@ class PointerEventConverter {
290295
pressureMax: datum.pressureMax,
291296
distance: datum.distance,
292297
distanceMax: datum.distanceMax,
298+
size: datum.size,
293299
radiusMajor: radiusMajor,
294300
radiusMinor: radiusMinor,
295301
radiusMin: radiusMin,
@@ -310,6 +316,7 @@ class PointerEventConverter {
310316
pressureMax: datum.pressureMax,
311317
distance: datum.distance,
312318
distanceMax: datum.distanceMax,
319+
size: datum.size,
313320
radiusMajor: radiusMajor,
314321
radiusMinor: radiusMinor,
315322
radiusMin: radiusMin,
@@ -335,6 +342,7 @@ class PointerEventConverter {
335342
pressureMax: datum.pressureMax,
336343
distance: datum.distance,
337344
distanceMax: datum.distanceMax,
345+
size: datum.size,
338346
radiusMajor: radiusMajor,
339347
radiusMinor: radiusMinor,
340348
radiusMin: radiusMin,

packages/flutter/lib/src/gestures/events.dart

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ abstract class PointerEvent {
108108
this.pressureMax = 1.0,
109109
this.distance = 0.0,
110110
this.distanceMax = 0.0,
111+
this.size = 0.0,
111112
this.radiusMajor = 0.0,
112113
this.radiusMinor = 0.0,
113114
this.radiusMin = 0.0,
@@ -183,6 +184,14 @@ abstract class PointerEvent {
183184
/// 0.0.
184185
final double distanceMax;
185186

187+
/// The area of the screen being pressed, scaled to a value between 0 and 1.
188+
/// The value of size can be used to determine fat touch events. This value
189+
/// is only set on Android, and is a device specific approximation within
190+
/// the range of detectable values. So, for example, the value of 0.1 could
191+
/// mean a touch with the tip of the finger, 0.2 a touch with full finger,
192+
/// and 0.3 the full palm.
193+
final double size;
194+
186195
/// The radius of the contact ellipse along the major axis, in logical pixels.
187196
final double radiusMajor;
188197

@@ -269,6 +278,7 @@ abstract class PointerEvent {
269278
'distance: $distance, '
270279
'distanceMin: $distanceMin, '
271280
'distanceMax: $distanceMax, '
281+
'size: $size, '
272282
'radiusMajor: $radiusMajor, '
273283
'radiusMinor: $radiusMinor, '
274284
'radiusMin: $radiusMin, '
@@ -374,6 +384,7 @@ class PointerHoverEvent extends PointerEvent {
374384
double pressureMax = 1.0,
375385
double distance = 0.0,
376386
double distanceMax = 0.0,
387+
double size = 0.0,
377388
double radiusMajor = 0.0,
378389
double radiusMinor = 0.0,
379390
double radiusMin = 0.0,
@@ -394,6 +405,7 @@ class PointerHoverEvent extends PointerEvent {
394405
pressureMax: pressureMax,
395406
distance: distance,
396407
distanceMax: distanceMax,
408+
size: size,
397409
radiusMajor: radiusMajor,
398410
radiusMinor: radiusMinor,
399411
radiusMin: radiusMin,
@@ -421,6 +433,7 @@ class PointerDownEvent extends PointerEvent {
421433
double pressureMin = 1.0,
422434
double pressureMax = 1.0,
423435
double distanceMax = 0.0,
436+
double size = 0.0,
424437
double radiusMajor = 0.0,
425438
double radiusMinor = 0.0,
426439
double radiusMin = 0.0,
@@ -441,6 +454,7 @@ class PointerDownEvent extends PointerEvent {
441454
pressureMax: pressureMax,
442455
distance: 0.0,
443456
distanceMax: distanceMax,
457+
size: size,
444458
radiusMajor: radiusMajor,
445459
radiusMinor: radiusMinor,
446460
radiusMin: radiusMin,
@@ -474,6 +488,7 @@ class PointerMoveEvent extends PointerEvent {
474488
double pressureMin = 1.0,
475489
double pressureMax = 1.0,
476490
double distanceMax = 0.0,
491+
double size = 0.0,
477492
double radiusMajor = 0.0,
478493
double radiusMinor = 0.0,
479494
double radiusMin = 0.0,
@@ -496,6 +511,7 @@ class PointerMoveEvent extends PointerEvent {
496511
pressureMax: pressureMax,
497512
distance: 0.0,
498513
distanceMax: distanceMax,
514+
size: size,
499515
radiusMajor: radiusMajor,
500516
radiusMinor: radiusMinor,
501517
radiusMin: radiusMin,
@@ -524,6 +540,7 @@ class PointerUpEvent extends PointerEvent {
524540
double pressureMax = 1.0,
525541
double distance = 0.0,
526542
double distanceMax = 0.0,
543+
double size = 0.0,
527544
double radiusMajor = 0.0,
528545
double radiusMinor = 0.0,
529546
double radiusMin = 0.0,
@@ -544,6 +561,7 @@ class PointerUpEvent extends PointerEvent {
544561
pressureMax: pressureMax,
545562
distance: distance,
546563
distanceMax: distanceMax,
564+
size: size,
547565
radiusMajor: radiusMajor,
548566
radiusMinor: radiusMinor,
549567
radiusMin: radiusMin,
@@ -570,6 +588,7 @@ class PointerCancelEvent extends PointerEvent {
570588
double pressureMax = 1.0,
571589
double distance = 0.0,
572590
double distanceMax = 0.0,
591+
double size = 0.0,
573592
double radiusMajor = 0.0,
574593
double radiusMinor = 0.0,
575594
double radiusMin = 0.0,
@@ -589,6 +608,7 @@ class PointerCancelEvent extends PointerEvent {
589608
pressureMax: pressureMax,
590609
distance: distance,
591610
distanceMax: distanceMax,
611+
size: size,
592612
radiusMajor: radiusMajor,
593613
radiusMinor: radiusMinor,
594614
radiusMin: radiusMin,

packages/flutter/lib/src/rendering/platform_view.dart

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -422,12 +422,7 @@ class _MotionEventsDispatcher {
422422
return AndroidPointerCoords(
423423
orientation: event.orientation,
424424
pressure: event.pressure,
425-
// Currently the engine omits the pointer size, for now I'm fixing this to 0.33 which is roughly
426-
// what I typically see on Android.
427-
//
428-
// TODO(amirh): Use the original pointer's size.
429-
// https://github.com/flutter/flutter/issues/20300
430-
size: 0.333,
425+
size: event.size,
431426
toolMajor: event.radiusMajor,
432427
toolMinor: event.radiusMinor,
433428
touchMajor: event.radiusMajor,

0 commit comments

Comments
 (0)