LibGDX调用setWindowedMode后如何避免窗口自动居中或重定位?
解决LibGDX调用setWindowedMode后窗口自动居中的问题
调用setWindowedMode()时LibGDX会自动将窗口居中,要避免这个问题,核心就是先记录原窗口位置,修改尺寸后立刻强制把窗口放回原位,具体实现如下:
步骤与代码示例
在你的resize()方法中按以下逻辑处理:
- 先获取当前窗口的坐标位置
- 计算符合目标宽高比的新尺寸
- 修改窗口尺寸(此时窗口会被自动居中)
- 立刻将窗口定位回原来的位置
@Override public void resize(int width, int height) { // 记录当前窗口的左上角坐标 int[] windowPos = new int[2]; ((Lwjgl3Application) Gdx.app).getWindow().getPosition(windowPos); int originalX = windowPos[0]; int originalY = windowPos[1]; // 计算保持目标宽高比的新尺寸(这里以你初始化的1900:980为例) float targetAspectRatio = 1900f / 980f; float currentAspect = (float) width / height; int newWidth = width; int newHeight = height; if (currentAspect > targetAspectRatio) { // 宽度超出比例,按高度计算适配后的宽度 newWidth = (int) (height * targetAspectRatio); } else if (currentAspect < targetAspectRatio) { // 高度超出比例,按宽度计算适配后的高度 newHeight = (int) (width / targetAspectRatio); } // 修改窗口尺寸(此时LibGDX会自动居中窗口) ((Lwjgl3Application) Gdx.app).getWindow().setWindowedMode(newWidth, newHeight); // 强制将窗口放回原位置 ((Lwjgl3Application) Gdx.app).getWindow().setWindowPosition(originalX, originalY); }
注意事项
- 调用
setWindowedMode()后要马上执行setWindowPosition(),避免窗口短暂居中的视觉闪烁(实际测试中几乎察觉不到) getPosition()获取的是窗口边框左上角的坐标,setWindowPosition()也是基于这个位置设置,不需要额外调整边框偏移- 确保计算出的新尺寸符合你初始化时设置的窗口大小限制(
config.setWindowSizeLimits(400, 400, 1900, 980)),避免尺寸超出限制导致无效修改
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

