diff --git a/shell/platform/android/io/flutter/embedding/engine/android/AndroidTouchProcessor.java b/shell/platform/android/io/flutter/embedding/engine/android/AndroidTouchProcessor.java index f26cc3e2bc84f80d79f76a8c87a2d7d3dd7d699a..8598b8a8df772fa3adcb2b5c45362910cd7f38db 100644 --- a/shell/platform/android/io/flutter/embedding/engine/android/AndroidTouchProcessor.java +++ b/shell/platform/android/io/flutter/embedding/engine/android/AndroidTouchProcessor.java @@ -150,7 +150,9 @@ public class AndroidTouchProcessor { // Mouse hover support is not implemented for API < 18. boolean isPointerEvent = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && event.isFromSource(InputDevice.SOURCE_CLASS_POINTER); - if (!isPointerEvent || event.getActionMasked() != MotionEvent.ACTION_HOVER_MOVE) { + boolean isMovementEvent = (event.getActionMasked() == MotionEvent.ACTION_HOVER_MOVE + || event.getActionMasked() == MotionEvent.ACTION_SCROLL); + if (!isPointerEvent || !isMovementEvent) { return false; } @@ -181,7 +183,9 @@ public class AndroidTouchProcessor { int pointerKind = getPointerDeviceTypeForToolType(event.getToolType(pointerIndex)); - int signalKind = PointerSignalKind.NONE; + int signalKind = event.getActionMasked() == MotionEvent.ACTION_SCROLL + ? PointerSignalKind.SCROLL + : PointerSignalKind.NONE; long timeStamp = event.getEventTime() * 1000; // Convert from milliseconds to microseconds. @@ -242,8 +246,13 @@ public class AndroidTouchProcessor { packet.putLong(pointerData); // platformData - packet.putDouble(0.0); // scroll_delta_x - packet.putDouble(0.0); // scroll_delta_y + if (signalKind == PointerSignalKind.SCROLL) { + packet.putDouble(-event.getAxisValue(MotionEvent.AXIS_HSCROLL)); // scroll_delta_x + packet.putDouble(-event.getAxisValue(MotionEvent.AXIS_VSCROLL)); // scroll_delta_y + } else { + packet.putDouble(0.0); // scroll_delta_x + packet.putDouble(0.0); // scroll_delta_x + } } @PointerChange @@ -269,6 +278,9 @@ public class AndroidTouchProcessor { if (maskedAction == MotionEvent.ACTION_CANCEL) { return PointerChange.CANCEL; } + if (maskedAction == MotionEvent.ACTION_SCROLL) { + return PointerChange.HOVER; + } return -1; }