醒来后 phone 我的 activity 恢复方向错误
After waking up the phone my activity recovers in wrong orientation
在我的 android 应用程序中,activity 必须仅在横向方向上保持。为此,我在文件 AndroidManifest.xml:
中修改了一个 activity-tag
<activity android:name="com.pckg.MyProj"
android:label="MyProject"
android:screenOrientation="landscape"
android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
它工作正常,但直到我锁定 phone 然后再次唤醒它。有时图片恢复正常,有时按如下方式失败。如果在锁定之前它看起来像这样
然后醒来之后的样子
看起来 phone 以纵向唤醒并将图像适合屏幕,但随后它提醒纵向被拒绝并试图纠正旋转图像的错误。生成的图像被相应地压缩和剪切;一个空的矩形保留在它的右边。我在几个不同的设备上产生了这种漂亮的效果。
您有解决方法吗?
也许尝试在 onResume() 中动态地膨胀片段?
已找到解决方案。问题在于我试图节省一些 OpenGL 操作。
在负责绘图的代码中,我从不更改 OpenGL 视口和矩阵,因此我决定在方法 onResume() 中设置一次,不再关心它。在 onResume() 中调用了以下方法(在 OpenGL 线程中):
public void on initState {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(x1, x2, y1, y2, 1, -1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
当用户解锁 phone 时,应用程序立即唤醒并调用 onResume 方法(因此调用 initState())。但此时屏幕可能仍处于纵向屏幕,因此 initState() 方法根据纵向屏幕设置 OpenGL 视口和矩阵。然后方向变为横向。 activity 出现在正确的方向,但由 OpenGL 构建,处于纵向设置的状态。
解决方法是把方法initState()放到绘图方法中,这样每次activity绘制的时候都会设置。
有趣(也很纠结)的是,效果只有在lock/unlock发生时才会出现。走出 phone 菜单是不够的。
在我的 android 应用程序中,activity 必须仅在横向方向上保持。为此,我在文件 AndroidManifest.xml:
中修改了一个 activity-tag<activity android:name="com.pckg.MyProj"
android:label="MyProject"
android:screenOrientation="landscape"
android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
它工作正常,但直到我锁定 phone 然后再次唤醒它。有时图片恢复正常,有时按如下方式失败。如果在锁定之前它看起来像这样
然后醒来之后的样子
看起来 phone 以纵向唤醒并将图像适合屏幕,但随后它提醒纵向被拒绝并试图纠正旋转图像的错误。生成的图像被相应地压缩和剪切;一个空的矩形保留在它的右边。我在几个不同的设备上产生了这种漂亮的效果。
您有解决方法吗?
也许尝试在 onResume() 中动态地膨胀片段?
已找到解决方案。问题在于我试图节省一些 OpenGL 操作。
在负责绘图的代码中,我从不更改 OpenGL 视口和矩阵,因此我决定在方法 onResume() 中设置一次,不再关心它。在 onResume() 中调用了以下方法(在 OpenGL 线程中):
public void on initState {
GL10 gl = glGraphics.getGL();
gl.glViewport(0, 0, width, height);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(x1, x2, y1, y2, 1, -1);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
当用户解锁 phone 时,应用程序立即唤醒并调用 onResume 方法(因此调用 initState())。但此时屏幕可能仍处于纵向屏幕,因此 initState() 方法根据纵向屏幕设置 OpenGL 视口和矩阵。然后方向变为横向。 activity 出现在正确的方向,但由 OpenGL 构建,处于纵向设置的状态。
解决方法是把方法initState()放到绘图方法中,这样每次activity绘制的时候都会设置。
有趣(也很纠结)的是,效果只有在lock/unlock发生时才会出现。走出 phone 菜单是不够的。