Skip to content

Commit f037022

Browse files
author
liuchuancong
committed
fix(白边)
1 parent 08a4d80 commit f037022

1 file changed

Lines changed: 38 additions & 65 deletions

File tree

lib/player/fullscreen.dart

Lines changed: 38 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import 'dart:io';
2+
import 'package:flutter/material.dart';
23
import 'package:flutter/services.dart';
34
import 'package:flutter/foundation.dart';
45
import 'package:window_manager/window_manager.dart';
@@ -15,39 +16,7 @@ Future<void> landScape() async {
1516
} else if (Platform.isAndroid || Platform.isIOS) {
1617
await AutoOrientation.landscapeAutoMode(forceSensor: true);
1718
} else if (Platform.isMacOS || Platform.isWindows || Platform.isLinux) {
18-
await windowManager.setHasShadow(false); // 去掉阴影
19-
await windowManager.setAsFrameless(); // 设置为无边框模式
20-
await windowManager.setFullScreen(true);
21-
// 1. 獲取目前視窗的中心點
22-
Rect windowRect = await windowManager.getBounds();
23-
Offset center = windowRect.center;
24-
25-
// 2. 獲取所有顯示器
26-
List<Display> displays = await screenRetriever.getAllDisplays();
27-
28-
// 3. 尋找視窗中心點在哪個顯示器範圍內
29-
Display currentDisplay = displays.firstWhere((display) {
30-
// 注意:這裡使用 visiblePosition 或 bounds.topLeft
31-
final Offset origin = display.visiblePosition ?? Offset.zero;
32-
final Size size = display.size;
33-
34-
return center.dx >= origin.dx &&
35-
center.dx <= origin.dx + size.width &&
36-
center.dy >= origin.dy &&
37-
center.dy <= origin.dy + size.height;
38-
}, orElse: () => displays.first);
39-
40-
// 4. 根據找到的螢幕設定全螢幕範圍
41-
await windowManager.setBounds(
42-
Rect.fromLTWH(
43-
currentDisplay.visiblePosition!.dx,
44-
currentDisplay.visiblePosition!.dy,
45-
currentDisplay.size.width,
46-
currentDisplay.size.height,
47-
),
48-
);
49-
50-
await windowManager.setAlwaysOnTop(false);
19+
await doEnterWindowFullScreen();
5120
}
5221
} catch (exception, stacktrace) {
5322
debugPrint(exception.toString());
@@ -64,38 +33,7 @@ Future<void> doEnterFullScreen() async {
6433
if (Platform.isAndroid || Platform.isIOS) {
6534
await SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
6635
} else {
67-
await windowManager.setHasShadow(false); // 去掉阴影
68-
await windowManager.setAsFrameless(); // 设置为无边框模式
69-
await windowManager.setFullScreen(true);
70-
// 1. 獲取目前視窗的中心點
71-
Rect windowRect = await windowManager.getBounds();
72-
Offset center = windowRect.center;
73-
74-
// 2. 獲取所有顯示器
75-
List<Display> displays = await screenRetriever.getAllDisplays();
76-
77-
// 3. 尋找視窗中心點在哪個顯示器範圍內
78-
Display currentDisplay = displays.firstWhere((display) {
79-
// 注意:這裡使用 visiblePosition 或 bounds.topLeft
80-
final Offset origin = display.visiblePosition ?? Offset.zero;
81-
final Size size = display.size;
82-
83-
return center.dx >= origin.dx &&
84-
center.dx <= origin.dx + size.width &&
85-
center.dy >= origin.dy &&
86-
center.dy <= origin.dy + size.height;
87-
}, orElse: () => displays.first);
88-
89-
// 4. 根據找到的螢幕設定全螢幕範圍
90-
await windowManager.setBounds(
91-
Rect.fromLTWH(
92-
currentDisplay.visiblePosition!.dx,
93-
currentDisplay.visiblePosition!.dy,
94-
currentDisplay.size.width,
95-
currentDisplay.size.height,
96-
),
97-
);
98-
await windowManager.setAlwaysOnTop(false);
36+
await doEnterWindowFullScreen();
9937
}
10038
}
10139

@@ -122,3 +60,38 @@ Future<void> doExitFullScreen() async {
12260
debugPrint(stacktrace.toString());
12361
}
12462
}
63+
64+
Future<void> doEnterWindowFullScreen() async {
65+
// 1. 先彻底移除装饰和阴影
66+
await windowManager.setHasShadow(false);
67+
await windowManager.setAsFrameless();
68+
// 建议增加:隐藏标题栏,防止 Windows 11 顶部出现细线
69+
await windowManager.setTitleBarStyle(TitleBarStyle.hidden, windowButtonVisibility: false);
70+
71+
Rect windowRect = await windowManager.getBounds();
72+
Offset center = windowRect.center;
73+
List<Display> displays = await screenRetriever.getAllDisplays();
74+
75+
Display currentDisplay = displays.firstWhere((display) {
76+
final Offset origin = display.visiblePosition ?? Offset.zero;
77+
final Size size = display.size;
78+
return center.dx >= origin.dx &&
79+
center.dx <= origin.dx + size.width &&
80+
center.dy >= origin.dy &&
81+
center.dy <= origin.dy + size.height;
82+
}, orElse: () => displays.first);
83+
84+
final double x = currentDisplay.visiblePosition!.dx.floorToDouble();
85+
final double y = currentDisplay.visiblePosition!.dy.floorToDouble();
86+
final double width = currentDisplay.size.width.ceilToDouble();
87+
final double height = currentDisplay.size.height.ceilToDouble();
88+
89+
await windowManager.setBounds(Rect.fromLTWH(x, y, width, height));
90+
91+
if (Platform.isWindows) {
92+
await windowManager.setBackgroundColor(Colors.black);
93+
}
94+
95+
await windowManager.setFullScreen(true);
96+
await windowManager.setAlwaysOnTop(false);
97+
}

0 commit comments

Comments
 (0)