Initial commit: Flutter 无书应用项目
This commit is contained in:
207
lib/utils/screen_adapter.dart
Normal file
207
lib/utils/screen_adapter.dart
Normal file
@@ -0,0 +1,207 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
|
||||
class ScreenAdapter {
|
||||
static void setPreferredOrientations() {
|
||||
SystemChrome.setPreferredOrientations([
|
||||
DeviceOrientation.portraitUp,
|
||||
DeviceOrientation.portraitDown,
|
||||
DeviceOrientation.landscapeLeft,
|
||||
DeviceOrientation.landscapeRight,
|
||||
]);
|
||||
}
|
||||
|
||||
static void enableSystemUIOverlay() {
|
||||
SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: [
|
||||
SystemUiOverlay.top,
|
||||
SystemUiOverlay.bottom,
|
||||
],
|
||||
);
|
||||
}
|
||||
|
||||
static void enableImmersiveMode() {
|
||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);
|
||||
}
|
||||
|
||||
static void setSystemUIOverlayStyle({
|
||||
Color? statusBarColor,
|
||||
Brightness? statusBarIconBrightness,
|
||||
}) {
|
||||
SystemChrome.setSystemUIOverlayStyle(
|
||||
SystemUiOverlayStyle(
|
||||
statusBarColor: statusBarColor ?? Colors.transparent,
|
||||
statusBarIconBrightness: statusBarIconBrightness ?? Brightness.dark,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
static bool isSplitScreen(BuildContext context) {
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
final screenHeight = MediaQuery.of(context).size.height;
|
||||
final aspectRatio = screenWidth / screenHeight;
|
||||
|
||||
// 分屏模式通常具有特殊的宽高比
|
||||
return aspectRatio > 2.0 || aspectRatio < 0.5;
|
||||
}
|
||||
|
||||
static bool isPopupWindow(BuildContext context) {
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
final screenHeight = MediaQuery.of(context).size.height;
|
||||
|
||||
// 小窗模式通常屏幕尺寸较小
|
||||
return screenWidth < 600 || screenHeight < 800;
|
||||
}
|
||||
|
||||
static bool isTabletMode(BuildContext context) {
|
||||
final shortestSide = MediaQuery.of(context).size.shortestSide;
|
||||
return shortestSide >= 600;
|
||||
}
|
||||
|
||||
static void adaptForSplitScreen(BuildContext context) {
|
||||
if (isSplitScreen(context)) {
|
||||
// 分屏模式下的适配
|
||||
SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: [SystemUiOverlay.top],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static void adaptForPopupWindow(BuildContext context) {
|
||||
if (isPopupWindow(context)) {
|
||||
// 小窗模式下的适配
|
||||
SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: [SystemUiOverlay.top],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static void handleOrientationChange(BuildContext context) {
|
||||
final orientation = MediaQuery.of(context).orientation;
|
||||
|
||||
if (orientation == Orientation.landscape) {
|
||||
// 横屏模式适配
|
||||
SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: [SystemUiOverlay.top],
|
||||
);
|
||||
} else {
|
||||
// 竖屏模式适配
|
||||
SystemChrome.setEnabledSystemUIMode(
|
||||
SystemUiMode.manual,
|
||||
overlays: [
|
||||
SystemUiOverlay.top,
|
||||
SystemUiOverlay.bottom,
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
static Size getAdaptiveSize(BuildContext context) {
|
||||
final mediaQuery = MediaQuery.of(context);
|
||||
final size = mediaQuery.size;
|
||||
final orientation = mediaQuery.orientation;
|
||||
|
||||
if (isSplitScreen(context)) {
|
||||
// 分屏模式下的尺寸调整
|
||||
return Size(
|
||||
size.width * 0.9,
|
||||
size.height * 0.85,
|
||||
);
|
||||
}
|
||||
|
||||
if (isPopupWindow(context)) {
|
||||
// 小窗模式下的尺寸调整
|
||||
return Size(
|
||||
size.width * 0.95,
|
||||
size.height * 0.9,
|
||||
);
|
||||
}
|
||||
|
||||
if (orientation == Orientation.landscape) {
|
||||
// 横屏模式下的尺寸调整
|
||||
return Size(
|
||||
size.width * 0.95,
|
||||
size.height * 0.9,
|
||||
);
|
||||
}
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static EdgeInsets getAdaptivePadding(BuildContext context) {
|
||||
final size = MediaQuery.of(context).size;
|
||||
|
||||
if (isSplitScreen(context)) {
|
||||
return EdgeInsets.symmetric(
|
||||
horizontal: size.width * 0.02,
|
||||
vertical: size.height * 0.02,
|
||||
);
|
||||
}
|
||||
|
||||
if (isPopupWindow(context)) {
|
||||
return EdgeInsets.symmetric(
|
||||
horizontal: size.width * 0.03,
|
||||
vertical: size.height * 0.03,
|
||||
);
|
||||
}
|
||||
|
||||
return const EdgeInsets.all(16.0);
|
||||
}
|
||||
|
||||
static double getAdaptiveFontSize(BuildContext context, double baseFontSize) {
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
|
||||
if (isSplitScreen(context)) {
|
||||
return baseFontSize * 0.9;
|
||||
}
|
||||
|
||||
if (isPopupWindow(context)) {
|
||||
return baseFontSize * 0.85;
|
||||
}
|
||||
|
||||
if (screenWidth < 600) {
|
||||
return baseFontSize * 0.9;
|
||||
} else if (screenWidth > 1200) {
|
||||
return baseFontSize * 1.1;
|
||||
}
|
||||
|
||||
return baseFontSize;
|
||||
}
|
||||
|
||||
static int getAdaptiveGridColumns(BuildContext context) {
|
||||
final screenWidth = MediaQuery.of(context).size.width;
|
||||
|
||||
if (isSplitScreen(context)) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (isPopupWindow(context)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (screenWidth >= 1440) {
|
||||
return 6;
|
||||
} else if (screenWidth >= 1024) {
|
||||
return 4;
|
||||
} else if (screenWidth >= 768) {
|
||||
return 3;
|
||||
} else {
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
static void setupAdaptiveConfig(BuildContext context) {
|
||||
// 设置自适应配置
|
||||
setPreferredOrientations();
|
||||
enableSystemUIOverlay();
|
||||
|
||||
// 根据屏幕状态进行适配
|
||||
adaptForSplitScreen(context);
|
||||
adaptForPopupWindow(context);
|
||||
handleOrientationChange(context);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user