JavaFX应用启动屏全屏缩放适配问题求助
JavaFX启动屏全屏适配:自动保持比例与居中
问题核心
当前固定倍数缩放、手动计算位置的方式仅适配特定分辨率,无法在全屏模式下自动维持启动屏元素的宽高比与相对位置。解决方案的核心是基于原始窗口尺寸的比例动态计算缩放值和坐标,彻底摆脱手动调整参数的需求。
实现步骤与代码修改
1. 定义基准尺寸,锁定原始比例
将非全屏状态的窗口尺寸设为基准,后续所有缩放逻辑都基于这个比例展开:
// 非全屏时的原始窗口尺寸,作为宽高比基准 private static final double ORIGINAL_WIDTH = 990; private static final double ORIGINAL_HEIGHT = 525; public static boolean fullscreen = false; public static double WIDTH = ORIGINAL_WIDTH; public static double HEIGHT = ORIGINAL_HEIGHT; public static Pane pane = new Pane();
2. 动态更新窗口尺寸(适配全屏/非全屏)
改用屏幕可视区域(排除任务栏、dock等系统UI)获取全屏尺寸,同时同步更新窗口大小:
public static void updateWindowSize(boolean isFullscreen) { fullscreen = isFullscreen; if (fullscreen) { Screen screen = Screen.getPrimary(); Rectangle2D visualBounds = screen.getVisualBounds(); WIDTH = visualBounds.getWidth(); HEIGHT = visualBounds.getHeight(); } else { WIDTH = ORIGINAL_WIDTH; HEIGHT = ORIGINAL_HEIGHT; } // 保留底部25px给输入框 pane.setPrefSize(WIDTH, HEIGHT - 25); }
3. 重构启动屏元素的缩放与位置计算
不再手动设置固定比例的X/Y坐标,而是基于原始位置和窗口缩放比例动态计算,同时严格保持元素自身宽高比:
public static void StartScreen() { pane.getChildren().clear(); // 切换状态时清空旧元素 pane.setStyle("-fx-background-color: transparent;"); Group sGroup = new Group(); Image i = new Image("file:start/So7AA.png"); // 计算窗口缩放比例:取宽、高缩放值的最小值,避免元素超出屏幕 double scaleX = WIDTH / ORIGINAL_WIDTH; double scaleY = HEIGHT / ORIGINAL_HEIGHT; double elementScale = Math.min(scaleX, scaleY); // --- 处理半透明外层元素 --- ImageView outer = new ImageView(i); double outerOriginalSize = 550; double scaledOuterSize = outerOriginalSize * elementScale; outer.setFitWidth(scaledOuterSize); outer.setFitHeight(scaledOuterSize); outer.setOpacity(.3); // 按原始相对位置比例计算新坐标 outer.setX((ORIGINAL_WIDTH / 4.75) * scaleX); outer.setY(-10 * scaleY); // --- 处理模糊印章元素 --- GaussianBlur gBlur = new GaussianBlur(); gBlur.setRadius(50); ImageView sealBlur = new ImageView(i); double sealOriginalSize = 450; double scaledSealSize = sealOriginalSize * elementScale; sealBlur.setFitWidth(scaledSealSize); sealBlur.setFitHeight(scaledSealSize); sealBlur.setEffect(gBlur); sealBlur.setX((ORIGINAL_WIDTH / 3.83) * scaleX); sealBlur.setY(39 * scaleY); // --- 处理清晰印章元素 --- ImageView seal = new ImageView(i); seal.setFitWidth(scaledSealSize); seal.setFitHeight(scaledSealSize); seal.setX((ORIGINAL_WIDTH / 3.83) * scaleX); seal.setY(39 * scaleY); // 添加元素到容器 sGroup.getChildren().addAll(outer, sealBlur, seal); pane.getChildren().add(sGroup); }
4. 使用方式
切换全屏/非全屏状态时,先更新窗口尺寸,再重新渲染启动屏:
// 切换到全屏 updateWindowSize(true); StartScreen(); // 切换回窗口模式 updateWindowSize(false); StartScreen();
额外优化:用布局容器简化居中逻辑
如果希望元素直接居中显示,无需手动计算坐标,可以用StackPane代替普通Pane,元素会自动居中:
// 替换原Pane为StackPane public static StackPane pane = new StackPane(); // 在StartScreen中,直接添加元素即可自动居中 pane.getChildren().add(outer); // 只需设置缩放后的尺寸,无需计算X/Y
内容的提问来源于stack exchange,提问作者Providence
相关产品推荐
相关产品推荐

