我正在处理这个问题,目前看来它似乎与SurfaceHolder.setFixedSize()相关的Android bug有关。
我获取这些日志的方法是:等待游戏加载完成,按下电源键,让屏幕变黑,再次按下电源键(快速),解锁滑块(快速)。顺便提一下,我的手机是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 view被重新设置为竖屏,在onResume之后又改回横屏。在清单文件中我将screenOrientation设置为横屏。
现在看看在相同的序列中使用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() 中执行 .setFixedSize() 没有任何效果。
更新和解决方案:
实际上,解决方案归结为恢复(实际上是不允许任何更改)我的 surface 视图。这可以通过在活动的 onConfigurationChanged 超级调用之后添加以下两行来完成。 (假设您设置了以下清单设置)。
android:configChanges="orientation"
android:screenOrientation="landscape"
这有效防止表面视图尺寸被设置为其他任何尺寸(如纵向)。顺便提一下,这就是我在指定screenOrientation = landscape时想要的结果!!!(我在这里看着你,Google)
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
mSView.getLayoutParams().width = 800;
mSView.getLayoutParams().height = 480;
}