如果我按了安卓手机上的电源按钮(或等待它超时),手机进入睡眠状态,在醒来后,屏幕纵横比就完全不正常了。
截图:
破碎的
对的
在游戏活动中。oncreate()

    // Grab display info
    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    ACTUAL_SCREEN_WIDTH = (int) dm.widthPixels;
    ACTUAL_SCREEN_HEIGHT = (int) dm.heightPixels;
    ACTUAL_DENSITY = dm.density;

    double scale = ((double) MainMenuActivity.resolutionScale / 100.0);
    SCREEN_WIDTH = (int) (ACTUAL_SCREEN_WIDTH * scale);
    SCREEN_HEIGHT = (int) (ACTUAL_SCREEN_HEIGHT * scale);
    DENSITY = ACTUAL_DENSITY * scale;

    // Setup graphics
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    surface_view = new GLSurfaceView(this);

    if (SCREEN_WIDTH != ACTUAL_SCREEN_WIDTH
            || SCREEN_HEIGHT != ACTUAL_SCREEN_HEIGHT)
        surface_view.getSurfaceHolder().setFixedSize(SCREEN_WIDTH,
                SCREEN_HEIGHT);

我在glsurfaceview中正确地重新加载了所有内容(例如,打回家,回到游戏中重新加载纹理等)。
我已经在onwindowfocuschanged中打印出了方向,它是横向的(如预期的那样)。
如果不使用setFixedSize(即ResolutionScale为100),则不会出现问题。此外,如果游戏前面出现另一个窗口(如“首选项”窗口),然后您返回游戏,则问题消失。
提前谢谢。自从研究结束后,我已经尝试了大约一个小时的随机事件。

最佳答案

我现在正在研究这个问题,现在看来是一个与surfaceholder.setFixedSize()相关的Android错误。
我要做的是:等待游戏加载,按下电源,让屏幕空白,再次按下电源(快速),解锁幻灯片(快速)。顺便说一下,这是HTC Thunderbolt 2.3.4上的。
以下是事件的正常过程(不使用setFixedSize):

----- power button pushed ------
JavaMain: onPause: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=1509 skin=default}
JavaMain: onConfigurationChanged, orientation: 1 thread: 1
JavaMain: mSView(old): 800x480
JavaMain: surfaceChanged: width: 480, height:800, thread: 1
JavaMain: onWindowFocusChanged: called, thread: 1
(screen is now off)
------ power button pushed, and slide-lock undone -----
JavaMain: onResume: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=1510 skin=default}
JavaMain: onConfigurationChanged, orientation: 2 thread: 1
JavaMain: mSView(old): 480x800
JavaMain: onWindowFocusChanged: called, thread: 1
JavaMain: surfaceChanged: width: 800, height:480, thread: 1
(back in game)

请注意,在onpause之后,我的surface视图将重做为纵向视图,在onresume之后,它将改回横向视图。我已在清单中将屏幕方向设置为横向。
现在看看在同一序列中发生了什么,但现在使用了surfaceholder.setFixedSize()(以降低分辨率):
----- power button pushed -------
JavaMain: onPause: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=1 layout=34 uiMode=17 seq=1513 skin=default}
JavaMain: onConfigurationChanged, orientation: 1 thread: 1
JavaMain: mSView(old): 800x480
JavaMain: surfaceChanged: width: 640, height:384, thread: 1
JavaMain: onWindowFocusChanged: called, thread: 1
(screen is now off)
------ power button pushed, and slide-lock undone -----
JavaMain: onResume: called, thread: 1
ActivityManager: Config changed: { scale=1.0 imsi=310/12 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=1514 skin=default}
JavaMain: onConfigurationChanged, orientation: 2 thread: 1
JavaMain: mSView(old): 480x800
JavaMain: onWindowFocusChanged: called, thread: 1
(back in game, with a messed up screen as in OP)

现在注意,在onpause之后,surfacechanged反映了我指定的固定大小,但是在onresume之后,surface视图是纵向的(有些出乎意料)。但真正缺少的是带有固定大小参数的surfacechanged调用。在您询问之前,onconfigurationchanged()中的no do.setfixedsize()没有任何效果。
更新和解决方案:
实际上,解决方法归结为恢复(实际上,永远不允许任何更改)我的表面视图。这是通过在活动的onconfigurationchanged中的super调用之后添加以下两行来完成的。(请设置以下清单设置)。
android:configChanges="orientation"
android:screenOrientation="landscape"

这可以有效地防止将表面视图尺寸设置为任何其他尺寸(例如人像)。顺便说一句,当我指定screenOrientation=Landscape时,这就是我想要的!!!!(我在这里看着你,谷歌)
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    // -- stomp any attempts by the OS to resize my view.
    // -- Hardcoded values for illustration only. In real life
    // -- you'll need to save these when the surface view is originally created
    mSView.getLayoutParams().width = 800;
    mSView.getLayoutParams().height = 480;
}

07-27 13:16