opt fullscreen

Closes #1442

Signed-off-by: bggRGjQaUbCoE <githubaccount56556@proton.me>
This commit is contained in:
bggRGjQaUbCoE
2025-10-03 21:14:33 +08:00
parent 5747dee03d
commit 16c152d306
3 changed files with 90 additions and 87 deletions

View File

@@ -369,7 +369,9 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
} }
PageUtils.routeObserver.unsubscribe(this); PageUtils.routeObserver.unsubscribe(this);
WidgetsBinding.instance.removeObserver(this); WidgetsBinding.instance.removeObserver(this);
showStatusBar(); if (Utils.isMobile) {
showStatusBar();
}
super.dispose(); super.dispose();
} }
@@ -545,7 +547,7 @@ class _VideoDetailPageVState extends State<VideoDetailPageV>
videoDetailController.animationController videoDetailController.animationController
..removeListener(animListener) ..removeListener(animListener)
..addListener(animListener); ..addListener(animListener);
if (mounted && isShowing && !isFullScreen) { if (Utils.isMobile && mounted && isShowing && !isFullScreen) {
if (isPortrait) { if (isPortrait) {
if (!videoDetailController.imageStatus) { if (!videoDetailController.imageStatus) {
showStatusBar(); showStatusBar();

View File

@@ -1511,48 +1511,53 @@ class PlPlayerController {
bool status = true, bool status = true,
bool inAppFullScreen = false, bool inAppFullScreen = false,
}) async { }) async {
if (isFullScreen.value == status) return;
if (fsProcessing) { if (fsProcessing) {
return; return;
} }
fsProcessing = true; fsProcessing = true;
if (!isFullScreen.value && status) { toggleFullScreen(status);
hideStatusBar();
/// 按照视频宽高比决定全屏方向 if (status) {
toggleFullScreen(true); if (Utils.isMobile) {
hideStatusBar();
/// 进入全屏 if (mode == FullScreenMode.none) {
if (mode == FullScreenMode.none) { fsProcessing = false;
fsProcessing = false; return;
return; }
} if (mode == FullScreenMode.gravity) {
if (mode == FullScreenMode.gravity) { await fullAutoModeForceSensor();
fullAutoModeForceSensor(); fsProcessing = false;
fsProcessing = false; return;
return; }
} late final size = Get.mediaQuery.size;
late final size = Get.size; if ((mode == FullScreenMode.vertical ||
if (Utils.isMobile && (mode == FullScreenMode.auto && isVertical) ||
(mode == FullScreenMode.vertical || (mode == FullScreenMode.ratio &&
(mode == FullScreenMode.auto && isVertical) || (isVertical || size.height / size.width < 1.25)))) {
(mode == FullScreenMode.ratio && await verticalScreenForTwoSeconds();
(isVertical || size.height / size.width < 1.25)))) { } else {
await verticalScreenForTwoSeconds(); await landscape();
}
} else { } else {
await landscape(inAppFullScreen: inAppFullScreen); await enterDesktopFullscreen();
} }
} else if (isFullScreen.value && !status) { } else {
showStatusBar(); if (Utils.isMobile) {
toggleFullScreen(false); showStatusBar();
if (mode == FullScreenMode.none) { if (mode == FullScreenMode.none) {
fsProcessing = false; fsProcessing = false;
return; return;
} }
if (!horizontalScreen) { if (!horizontalScreen) {
await verticalScreenForTwoSeconds(); await verticalScreenForTwoSeconds();
} else {
await autoScreen();
}
} else { } else {
await autoScreen(); await exitDesktopFullscreen();
} }
} }
fsProcessing = false; fsProcessing = false;

View File

@@ -7,93 +7,89 @@ import 'package:auto_orientation/auto_orientation.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
//横屏 bool _isDesktopFullScreen = false;
Future<void> landscape({bool inAppFullScreen = false}) async {
try { Future<void> enterDesktopFullscreen({bool inAppFullScreen = false}) async {
if (Utils.isMobile) { if (!inAppFullScreen && !_isDesktopFullScreen) {
await AutoOrientation.landscapeAutoMode(forceSensor: true); _isDesktopFullScreen = true;
} else if (Utils.isDesktop && !inAppFullScreen) { try {
await const MethodChannel( await const MethodChannel(
'com.alexmercerind/media_kit_video', 'com.alexmercerind/media_kit_video',
).invokeMethod('Utils.EnterNativeFullscreen'); ).invokeMethod('Utils.EnterNativeFullscreen');
} catch (_) {
if (kDebugMode) rethrow;
} }
} catch (exception, stacktrace) { }
if (kDebugMode) { }
debugPrint(exception.toString());
debugPrint(stacktrace.toString()); Future<void> exitDesktopFullscreen() async {
if (_isDesktopFullScreen) {
_isDesktopFullScreen = false;
try {
await const MethodChannel(
'com.alexmercerind/media_kit_video',
).invokeMethod('Utils.ExitNativeFullscreen');
} catch (_) {
if (kDebugMode) rethrow;
} }
} }
} }
//横屏
Future<void> landscape() async {
try {
await AutoOrientation.landscapeAutoMode(forceSensor: true);
} catch (_) {
if (kDebugMode) rethrow;
}
}
//竖屏 //竖屏
Future<void> verticalScreenForTwoSeconds() async { Future<void> verticalScreenForTwoSeconds() async {
await SystemChrome.setPreferredOrientations([ await SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
DeviceOrientation.portraitUp,
]);
await autoScreen(); await autoScreen();
} }
//竖屏
Future<void> verticalScreen() async {
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
]);
}
//全向 //全向
bool allowRotateScreen = Pref.allowRotateScreen; bool allowRotateScreen = Pref.allowRotateScreen;
Future<void> autoScreen() async { Future<void> autoScreen() async {
if (!allowRotateScreen) { if (Utils.isMobile && allowRotateScreen) {
return; await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
// DeviceOrientation.portraitDown,
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
} }
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
// DeviceOrientation.portraitDown,
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
} }
Future<void> fullAutoModeForceSensor() async { Future<void> fullAutoModeForceSensor() async {
await AutoOrientation.fullAutoMode(forceSensor: true); await AutoOrientation.fullAutoMode(forceSensor: true);
} }
bool _showStatusBar = true;
Future<void> hideStatusBar() async { Future<void> hideStatusBar() async {
if (!_showStatusBar) { if (!_showStatusBar) {
return; return;
} }
_showStatusBar = false; _showStatusBar = false;
await SystemChrome.setEnabledSystemUIMode( await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
SystemUiMode.immersiveSticky,
);
} }
bool _showStatusBar = true;
//退出全屏显示 //退出全屏显示
Future<void> showStatusBar() async { Future<void> showStatusBar() async {
if (_showStatusBar) { if (_showStatusBar) {
return; return;
} }
_showStatusBar = true; _showStatusBar = true;
try { SystemUiMode mode;
if (Utils.isMobile) { if (Platform.isAndroid && (await Utils.sdkInt < 29)) {
SystemUiMode mode; mode = SystemUiMode.manual;
if (Platform.isAndroid && (await Utils.sdkInt < 29)) { } else {
mode = SystemUiMode.manual; mode = SystemUiMode.edgeToEdge;
} 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;
} }
await SystemChrome.setEnabledSystemUIMode(
mode,
overlays: SystemUiOverlay.values,
);
} }