diff --git a/lib/common/widgets/gesture/player_gesture_recognizer.dart b/lib/common/widgets/gesture/player_gesture_recognizer.dart new file mode 100644 index 000000000..8db3627db --- /dev/null +++ b/lib/common/widgets/gesture/player_gesture_recognizer.dart @@ -0,0 +1,43 @@ +import 'package:flutter/gestures.dart' + show + GestureRecognizer, + RecognizerCallback, + ScaleGestureRecognizer, + LongPressGestureRecognizer; + +mixin PlayerGestureMixin on GestureRecognizer { + bool isPosAllowed = true; + + @override + T? invokeCallback( + String name, + RecognizerCallback callback, { + String Function()? debugReport, + }) { + if (!isPosAllowed) return null; + return super.invokeCallback(name, callback, debugReport: debugReport); + } +} + +class PlayerScaleGestureRecognizer extends ScaleGestureRecognizer + with PlayerGestureMixin { + PlayerScaleGestureRecognizer({ + super.debugOwner, + super.supportedDevices, + super.allowedButtonsFilter, + super.dragStartBehavior, + super.trackpadScrollCausesScale, + super.trackpadScrollToScaleFactor, + }); +} + +class PlayerLongPressGestureRecognizer extends LongPressGestureRecognizer + with PlayerGestureMixin { + PlayerLongPressGestureRecognizer({ + Duration? duration, + super.postAcceptSlopTolerance, + super.supportedDevices, + super.debugOwner, + super.allowedButtonsFilter, + }); +} diff --git a/lib/plugin/pl_player/view/view.dart b/lib/plugin/pl_player/view/view.dart index 4978c776d..bc8359c08 100644 --- a/lib/plugin/pl_player/view/view.dart +++ b/lib/plugin/pl_player/view/view.dart @@ -10,6 +10,7 @@ import 'package:PiliPlus/common/widgets/cropped_image.dart'; import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/disabled_icon.dart'; import 'package:PiliPlus/common/widgets/gesture/mouse_interactive_viewer.dart'; +import 'package:PiliPlus/common/widgets/gesture/player_gesture_recognizer.dart'; import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/player_bar.dart'; import 'package:PiliPlus/common/widgets/progress_bar/audio_video_progress_bar.dart'; @@ -242,7 +243,7 @@ class _PLVideoPlayerState extends State _doubleTapGestureRecognizer = DoubleTapGestureRecognizer() ..onDoubleTapDown = _onDoubleTapDown; - _scaleGestureRecognizer = ScaleGestureRecognizer( + _scaleGestureRecognizer = PlayerScaleGestureRecognizer( debugOwner: this, dragStartBehavior: .start, allowedButtonsFilter: (buttons) => buttons == kPrimaryButton, @@ -1007,9 +1008,9 @@ class _PLVideoPlayerState extends State } } - LongPressGestureRecognizer? _longPressRecognizer; - LongPressGestureRecognizer get longPressRecognizer => - _longPressRecognizer ??= LongPressGestureRecognizer() + PlayerLongPressGestureRecognizer? _longPressRecognizer; + PlayerLongPressGestureRecognizer get longPressRecognizer => + _longPressRecognizer ??= PlayerLongPressGestureRecognizer() ..onLongPressStart = ((_) => plPlayerController.setLongPressStatus(true)) ..onLongPressEnd = ((_) => plPlayerController.setLongPressStatus(false)) @@ -1017,9 +1018,9 @@ class _PLVideoPlayerState extends State plPlayerController.setLongPressStatus(false)); late final TapGestureRecognizer _tapGestureRecognizer; late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer; - late final ScaleGestureRecognizer _scaleGestureRecognizer; + late final PlayerScaleGestureRecognizer _scaleGestureRecognizer; - static const _kOffsetThreshold = 30.0; + static const _kOffsetThreshold = 25.0; bool _isPositionAllowed(Offset offset) { if (offset.dx < _kOffsetThreshold || offset.dy < _kOffsetThreshold || @@ -1051,15 +1052,18 @@ class _PLVideoPlayerState extends State final controlsUnlock = !plPlayerController.controlsLock.value; if (PlatformUtils.isMobile) { - if (_isPositionAllowed(event.localPosition)) { - _tapGestureRecognizer.addPointer(event); - if (controlsUnlock) { - if (!plPlayerController.isLive) { - _doubleTapGestureRecognizer.addPointer(event); - longPressRecognizer.addPointer(event); - } - _scaleGestureRecognizer.addPointer(event); + _tapGestureRecognizer.addPointer(event); + if (controlsUnlock) { + final isPosAllowed = _isPositionAllowed(event.localPosition); + if (!plPlayerController.isLive) { + _doubleTapGestureRecognizer.addPointer(event); + longPressRecognizer + ..isPosAllowed = isPosAllowed + ..addPointer(event); } + _scaleGestureRecognizer + ..isPosAllowed = isPosAllowed + ..addPointer(event); } } else if (controlsUnlock) { if (plPlayerController.isLive) {