diff --git a/lib/pages/video/view.dart b/lib/pages/video/view.dart index 5311ed23..309a3036 100644 --- a/lib/pages/video/view.dart +++ b/lib/pages/video/view.dart @@ -369,7 +369,9 @@ class _VideoDetailPageVState extends State } PageUtils.routeObserver.unsubscribe(this); WidgetsBinding.instance.removeObserver(this); - showStatusBar(); + if (Utils.isMobile) { + showStatusBar(); + } super.dispose(); } @@ -545,7 +547,7 @@ class _VideoDetailPageVState extends State videoDetailController.animationController ..removeListener(animListener) ..addListener(animListener); - if (mounted && isShowing && !isFullScreen) { + if (Utils.isMobile && mounted && isShowing && !isFullScreen) { if (isPortrait) { if (!videoDetailController.imageStatus) { showStatusBar(); diff --git a/lib/plugin/pl_player/controller.dart b/lib/plugin/pl_player/controller.dart index 42ee77e3..a3a2ca97 100644 --- a/lib/plugin/pl_player/controller.dart +++ b/lib/plugin/pl_player/controller.dart @@ -1511,48 +1511,53 @@ class PlPlayerController { bool status = true, bool inAppFullScreen = false, }) async { + if (isFullScreen.value == status) return; + if (fsProcessing) { return; } fsProcessing = true; - if (!isFullScreen.value && status) { - hideStatusBar(); + toggleFullScreen(status); - /// 按照视频宽高比决定全屏方向 - toggleFullScreen(true); - - /// 进入全屏 - if (mode == FullScreenMode.none) { - fsProcessing = false; - return; - } - if (mode == FullScreenMode.gravity) { - fullAutoModeForceSensor(); - fsProcessing = false; - return; - } - late final size = Get.size; - if (Utils.isMobile && - (mode == FullScreenMode.vertical || - (mode == FullScreenMode.auto && isVertical) || - (mode == FullScreenMode.ratio && - (isVertical || size.height / size.width < 1.25)))) { - await verticalScreenForTwoSeconds(); + if (status) { + if (Utils.isMobile) { + hideStatusBar(); + if (mode == FullScreenMode.none) { + fsProcessing = false; + return; + } + if (mode == FullScreenMode.gravity) { + await fullAutoModeForceSensor(); + fsProcessing = false; + return; + } + late final size = Get.mediaQuery.size; + if ((mode == FullScreenMode.vertical || + (mode == FullScreenMode.auto && isVertical) || + (mode == FullScreenMode.ratio && + (isVertical || size.height / size.width < 1.25)))) { + await verticalScreenForTwoSeconds(); + } else { + await landscape(); + } } else { - await landscape(inAppFullScreen: inAppFullScreen); + await enterDesktopFullscreen(); } - } else if (isFullScreen.value && !status) { - showStatusBar(); - toggleFullScreen(false); - if (mode == FullScreenMode.none) { - fsProcessing = false; - return; - } - if (!horizontalScreen) { - await verticalScreenForTwoSeconds(); + } else { + if (Utils.isMobile) { + showStatusBar(); + if (mode == FullScreenMode.none) { + fsProcessing = false; + return; + } + if (!horizontalScreen) { + await verticalScreenForTwoSeconds(); + } else { + await autoScreen(); + } } else { - await autoScreen(); + await exitDesktopFullscreen(); } } fsProcessing = false; diff --git a/lib/plugin/pl_player/utils/fullscreen.dart b/lib/plugin/pl_player/utils/fullscreen.dart index bb5dcd55..07c62da1 100644 --- a/lib/plugin/pl_player/utils/fullscreen.dart +++ b/lib/plugin/pl_player/utils/fullscreen.dart @@ -7,93 +7,89 @@ import 'package:auto_orientation/auto_orientation.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/services.dart'; -//横屏 -Future landscape({bool inAppFullScreen = false}) async { - try { - if (Utils.isMobile) { - await AutoOrientation.landscapeAutoMode(forceSensor: true); - } else if (Utils.isDesktop && !inAppFullScreen) { +bool _isDesktopFullScreen = false; + +Future enterDesktopFullscreen({bool inAppFullScreen = false}) async { + if (!inAppFullScreen && !_isDesktopFullScreen) { + _isDesktopFullScreen = true; + try { await const MethodChannel( 'com.alexmercerind/media_kit_video', ).invokeMethod('Utils.EnterNativeFullscreen'); + } catch (_) { + if (kDebugMode) rethrow; } - } catch (exception, stacktrace) { - if (kDebugMode) { - debugPrint(exception.toString()); - debugPrint(stacktrace.toString()); + } +} + +Future exitDesktopFullscreen() async { + if (_isDesktopFullScreen) { + _isDesktopFullScreen = false; + try { + await const MethodChannel( + 'com.alexmercerind/media_kit_video', + ).invokeMethod('Utils.ExitNativeFullscreen'); + } catch (_) { + if (kDebugMode) rethrow; } } } +//横屏 +Future landscape() async { + try { + await AutoOrientation.landscapeAutoMode(forceSensor: true); + } catch (_) { + if (kDebugMode) rethrow; + } +} + //竖屏 Future verticalScreenForTwoSeconds() async { - await SystemChrome.setPreferredOrientations([ - DeviceOrientation.portraitUp, - ]); + await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]); await autoScreen(); } -//竖屏 -Future verticalScreen() async { - await SystemChrome.setPreferredOrientations([ - DeviceOrientation.portraitUp, - ]); -} - //全向 bool allowRotateScreen = Pref.allowRotateScreen; Future autoScreen() async { - if (!allowRotateScreen) { - return; + if (Utils.isMobile && allowRotateScreen) { + await SystemChrome.setPreferredOrientations([ + DeviceOrientation.portraitUp, + // DeviceOrientation.portraitDown, + DeviceOrientation.landscapeLeft, + DeviceOrientation.landscapeRight, + ]); } - await SystemChrome.setPreferredOrientations([ - DeviceOrientation.portraitUp, - // DeviceOrientation.portraitDown, - DeviceOrientation.landscapeLeft, - DeviceOrientation.landscapeRight, - ]); } Future fullAutoModeForceSensor() async { await AutoOrientation.fullAutoMode(forceSensor: true); } +bool _showStatusBar = true; Future hideStatusBar() async { if (!_showStatusBar) { return; } _showStatusBar = false; - await SystemChrome.setEnabledSystemUIMode( - SystemUiMode.immersiveSticky, - ); + await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); } -bool _showStatusBar = true; - //退出全屏显示 Future showStatusBar() async { if (_showStatusBar) { return; } _showStatusBar = true; - try { - if (Utils.isMobile) { - SystemUiMode mode; - if (Platform.isAndroid && (await Utils.sdkInt < 29)) { - mode = SystemUiMode.manual; - } else { - mode = SystemUiMode.edgeToEdge; - } - await SystemChrome.setEnabledSystemUIMode( - mode, - overlays: SystemUiOverlay.values, - ); - } else if (Utils.isDesktop) { - await const MethodChannel( - 'com.alexmercerind/media_kit_video', - ).invokeMethod('Utils.ExitNativeFullscreen'); - } - } catch (_) { - if (kDebugMode) rethrow; + SystemUiMode mode; + if (Platform.isAndroid && (await Utils.sdkInt < 29)) { + mode = SystemUiMode.manual; + } else { + mode = SystemUiMode.edgeToEdge; } + await SystemChrome.setEnabledSystemUIMode( + mode, + overlays: SystemUiOverlay.values, + ); }