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..3aa14a8ec --- /dev/null +++ b/lib/common/widgets/gesture/player_gesture_recognizer.dart @@ -0,0 +1,28 @@ +import 'package:flutter/gestures.dart' + show ScaleGestureRecognizer, RecognizerCallback, GestureRecognizer; + +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, + }); +} diff --git a/lib/plugin/pl_player/view/view.dart b/lib/plugin/pl_player/view/view.dart index 17ed42f39..a4d433427 100644 --- a/lib/plugin/pl_player/view/view.dart +++ b/lib/plugin/pl_player/view/view.dart @@ -11,6 +11,7 @@ import 'package:PiliPlus/common/widgets/custom_icon.dart'; import 'package:PiliPlus/common/widgets/disabled_icon.dart'; import 'package:PiliPlus/common/widgets/gesture/immediate_tap_gesture_recognizer.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/loading_widget.dart'; import 'package:PiliPlus/common/widgets/pair.dart'; import 'package:PiliPlus/common/widgets/player_bar.dart'; @@ -289,7 +290,7 @@ class _PLVideoPlayerState extends State _doubleTapGestureRecognizer = DoubleTapGestureRecognizer() ..onDoubleTapDown = _onDoubleTapDown; - _scaleGestureRecognizer = ScaleGestureRecognizer( + _scaleGestureRecognizer = PlayerScaleGestureRecognizer( debugOwner: this, dragStartBehavior: .start, allowedButtonsFilter: (buttons) => buttons == kPrimaryButton, @@ -1207,11 +1208,11 @@ class _PLVideoPlayerState extends State plPlayerController.setLongPressStatus(false)); late final ImmediateTapGestureRecognizer _tapGestureRecognizer; late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer; - late final ScaleGestureRecognizer _scaleGestureRecognizer; + late final PlayerScaleGestureRecognizer _scaleGestureRecognizer; StreamSubscription? _danmakuListener; - static const _kOffsetThreshold = 30.0; + static const _kOffsetThreshold = 25.0; bool _isPositionAllowed(Offset offset) { if (offset.dx < _kOffsetThreshold || offset.dy < _kOffsetThreshold || @@ -1249,9 +1250,9 @@ class _PLVideoPlayerState extends State _doubleTapGestureRecognizer.addPointer(event); longPressRecognizer.addPointer(event); } - if (_isPositionAllowed(event.localPosition)) { - _scaleGestureRecognizer.addPointer(event); - } + _scaleGestureRecognizer + ..isPosAllowed = _isPositionAllowed(event.localPosition) + ..addPointer(event); } } else if (controlsUnlock) { if (plPlayerController.isLive) {