安卓:禁用屏幕旋转的堆栈

3
我的应用程序被设计为“仅限横屏”。必须支持左右横屏之间的旋转,因此我使用了android:screenOrientation="sensorLandscape"。但是,在我的应用程序中有一个小游戏,完全禁用旋转(因为这个小游戏要由设备倾斜来控制)。小游戏结束后,方向处理策略必须恢复到sensorLandscape。禁用方向更改的标准方法是调用:
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

但这并不是这种情况!如此处所述(并由我检查),它会导致方向更改为默认状态(可能是纵向)。

因此,从 sensorLandscape 到 "disableRotation" 的唯一方法是明确设置所需的方向。 所以我有一个选择:要么调用

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

或者

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);

显然,我需要传递当前方向,但似乎Android没有获取它的功能!
getResources()。getConfiguration()。orientation返回Configuration.ORIENTATION_PORTRAITConfiguration.ORIENTATION_LANDSCAPE,并没有用处。
getWindowManager()。getDefaultDisplay()。getRotation()似乎更有希望。它返回Surface.ROTATION_0...Surface.ROTATION_270,我尝试使用以下逻辑:
int getCurrentOrintation()
{
    final int rot = getWindowManager().getDefaultDisplay().getRotation();
    if (Surface.ROTATION_0 == rot || Surface.ROTATION_90 == rot)
    {
        return ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
    }
    return ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE;
}

在Google Nexus上运行良好,但在Kindle Fire HD上返回翻转方向。

那么,在Android中原则上是否可能暂时锁定方向更改?


你在小游戏中使用单独的活动吗? - Submersed
@Submersed 没有。无论如何,如果我使用单独的活动,它怎么能帮助呢? - Nick
3个回答

1
您可以在Android清单文件中声明screenOrientation="locked"或使用编程等效方法ActivityInfo.SCREEN_ORIENTATION_LOCKED来锁定特定活动的方向。但是,此功能仅适用于API级别18及以上的新设备。有关更多信息,请参见清单文件documentation

是的,SCREEN_ORIENTATION_LOCKED 看起来很有前途(虽然我没有尝试过)。但正如你所提到的,API级别18对我来说是一个停止标志。我必须支持API级别>= 10。 - Nick

0
您可以使用以下代码获取当前方向并锁定它。
        int currentOrient = getResources().getConfiguration().orientation;
        if (currentOrient == Configuration.ORIENTATION_LANDSCAPE) 
        {
            setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);//Lock to Landscape mode
        }
        else
        {
           setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);//Lock to Potrait mode
        }

在我的情况下,currentOrient 总是 Configuration.ORIENTATION_LANDSCAPE。我需要知道它是 SCREEN_ORIENTATION_LANDSCAPE 还是 SCREEN_ORIENTATION_REVERSE_LANDSCAPE - Nick
你看过这个 Stack 的帖子吗? 试着查看博客链接,看看是否有帮助。 http://stackoverflow.com/a/6021094/855303 - Karan_Rana
他们建议使用getRotation。但它并不适用于一般情况。我已经检查过了--请参见我问题中的最后一段。 - Nick

0

强制方向不会禁用加速度计/陀螺仪传感器,因此您不需要删除方向锁定。

但是,您应该注意传感器提供的值是标准传感器坐标系中的:

加速度计使用标准传感器坐标系。在实践中,这意味着当设备以自然方向平放在桌子上时,以下条件适用:

如果您将设备向左侧推(使其向右移动),则x加速度值为正。 如果您将设备向下推(使其远离您),则y加速度值为正。

如果您以A m/s2的加速度将设备向天空推,则z加速度值等于A + 9.81,这对应于设备的加速度(+A m/s2)减去重力力量(-9.81 m/s2)。

静止的设备将具有+9.81的加速度值,这对应于设备的加速度(0 m/s2减去重力,即-9.81 m/s2)。


谢谢您的解释,但它并没有回答我的问题,即“如何锁定设备方向?” - Nick
你的小游戏需要将设备翻转180度吗? - FunkTheMonk
我的小游戏在玩家倾斜设备时不想被翻转。是的,在这个小游戏中,设备倾斜是游戏玩法的一部分。 - Nick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接