From fbf47d748596ae7b2e583a7f5f9edfa70fe9adb1 Mon Sep 17 00:00:00 2001 From: bggRGjQaUbCoE Date: Tue, 22 Jul 2025 11:24:47 +0800 Subject: [PATCH] fix #877 Signed-off-by: bggRGjQaUbCoE --- lib/pages/setting/models/play_settings.dart | 3 + lib/plugin/pl_player/controller.dart | 83 +++++++++++---------- lib/plugin/pl_player/utils/fullscreen.dart | 14 +--- lib/plugin/pl_player/view.dart | 7 +- 4 files changed, 53 insertions(+), 54 deletions(-) diff --git a/lib/pages/setting/models/play_settings.dart b/lib/pages/setting/models/play_settings.dart index 908538d2..739e19d2 100644 --- a/lib/pages/setting/models/play_settings.dart +++ b/lib/pages/setting/models/play_settings.dart @@ -7,6 +7,8 @@ import 'package:PiliPlus/pages/setting/models/model.dart'; import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart'; import 'package:PiliPlus/plugin/pl_player/models/bottom_progress_behavior.dart'; import 'package:PiliPlus/plugin/pl_player/models/fullscreen_mode.dart'; +import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart' + show allowRotateScreen; import 'package:PiliPlus/services/service_locator.dart'; import 'package:PiliPlus/utils/storage.dart'; import 'package:PiliPlus/utils/storage_key.dart'; @@ -152,6 +154,7 @@ List get playSettings => [ leading: const Icon(Icons.screen_rotation_alt_outlined), setKey: SettingBoxKey.allowRotateScreen, defaultVal: true, + onChanged: (value) => allowRotateScreen = value, ), SettingsModel( settingsType: SettingsType.sw1tch, diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index e936c3bb..2e7ec66e 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -1324,49 +1324,54 @@ class PlPlayerController { late final horizontalScreen = Pref.horizontalScreen; // 全屏 - void triggerFullScreen({bool status = true, int duration = 500}) { - EasyThrottle.throttle('fullScreen', Duration(milliseconds: duration), - () async { - stopScreenTimer(); + bool fsProcessing = false; + Future triggerFullScreen({bool status = true}) async { + if (fsProcessing) { + return; + } + fsProcessing = true; - if (!isFullScreen.value && status) { - hideStatusBar(); + if (!isFullScreen.value && status) { + hideStatusBar(); - /// 按照视频宽高比决定全屏方向 - toggleFullScreen(true); + /// 按照视频宽高比决定全屏方向 + toggleFullScreen(true); - /// 进入全屏 - if (mode == FullScreenMode.none) { - return; - } - if (mode == FullScreenMode.gravity) { - fullAutoModeForceSensor(); - return; - } - if (mode == FullScreenMode.vertical || - (mode == FullScreenMode.auto && direction.value == 'vertical') || - (mode == FullScreenMode.ratio && - (Get.height / Get.width < 1.25 || - direction.value == 'vertical'))) { - await verticalScreenForTwoSeconds(); - } else { - await landScape(); - } - } else if (isFullScreen.value && !status) { - if (Get.currentRoute.startsWith('/liveRoom') || !removeSafeArea) { - showStatusBar(); - } - toggleFullScreen(false); - if (mode == FullScreenMode.none) { - return; - } - if (!horizontalScreen) { - await verticalScreenForTwoSeconds(); - } else { - await autoScreen(); - } + /// 进入全屏 + if (mode == FullScreenMode.none) { + fsProcessing = false; + return; } - }); + if (mode == FullScreenMode.gravity) { + fullAutoModeForceSensor(); + fsProcessing = false; + return; + } + if (mode == FullScreenMode.vertical || + (mode == FullScreenMode.auto && direction.value == 'vertical') || + (mode == FullScreenMode.ratio && + (Get.height / Get.width < 1.25 || + direction.value == 'vertical'))) { + await verticalScreenForTwoSeconds(); + } else { + await landScape(); + } + } else if (isFullScreen.value && !status) { + if (Get.currentRoute.startsWith('/liveRoom') || !removeSafeArea) { + showStatusBar(); + } + toggleFullScreen(false); + if (mode == FullScreenMode.none) { + fsProcessing = false; + return; + } + if (!horizontalScreen) { + await verticalScreenForTwoSeconds(); + } else { + await autoScreen(); + } + } + fsProcessing = false; } void addPositionListener(Function(Duration position) listener) => diff --git a/lib/plugin/pl_player/utils/fullscreen.dart b/lib/plugin/pl_player/utils/fullscreen.dart index b5e46324..d64e4e8b 100644 --- a/lib/plugin/pl_player/utils/fullscreen.dart +++ b/lib/plugin/pl_player/utils/fullscreen.dart @@ -7,12 +7,6 @@ import 'package:device_info_plus/device_info_plus.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -Timer? screenTimer; -void stopScreenTimer() { - screenTimer?.cancel(); - screenTimer = null; -} - //横屏 Future landScape() async { dynamic document; @@ -40,10 +34,7 @@ Future verticalScreenForTwoSeconds() async { await SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]); - screenTimer = Timer(const Duration(seconds: 2), () { - autoScreen(); - screenTimer = null; - }); + await autoScreen(); } //竖屏 @@ -54,8 +45,9 @@ Future verticalScreen() async { } //全向 +bool allowRotateScreen = Pref.allowRotateScreen; Future autoScreen() async { - if (!Pref.allowRotateScreen) { + if (!allowRotateScreen) { return; } await SystemChrome.setPreferredOrientations([ diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 5c85e443..a2e0da82 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -627,8 +627,8 @@ class _PLVideoPlayerState extends State size: 24, color: Colors.white, ), - onTap: () => plPlayerController.triggerFullScreen( - status: !isFullScreen, duration: 800), + onTap: () => + plPlayerController.triggerFullScreen(status: !isFullScreen), ), ), ), @@ -876,8 +876,7 @@ class _PLVideoPlayerState extends State details.localFocalPoint.dy - _initialFocalPoint.dy; void fullScreenTrigger(bool status) { - plPlayerController.triggerFullScreen( - status: status, duration: 800); + plPlayerController.triggerFullScreen(status: status); } if (cumulativeDy > threshold) {