Android:禁用方向更改堆栈

时间:2013-06-17 16:31:30

标签: android android-orientation

我的应用程序旨在“仅景观”。必须支持左右横向之间的旋转,因此我使用的是android:screenOrientation="sensorLandscape"

然而,我的应用程序中有一个迷你游戏,必须完全禁用旋转(因为这个迷你游戏将由设备tlting控制)。迷你游戏完成后,必须将方向处理政策恢复为sensorLandscape

禁用方向更改的标准方法是调用

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

但不是在这种情况下!如上所述here(并由我检查),它会导致定向更改为默认状态(可能是肖像)。

因此,从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;
}

它在谷歌Nexus上运行良好,但在Kindle Fire HD上返回翻转。

那么,原则上可以暂时锁定Android中的方向更改吗?

3 个答案:

答案 0 :(得分:1)

您可以通过在Android清单中声明screenOrientation="locked"或使用程序化等效项ActivityInfo.SCREEN_ORIENTATION_LOCKED来锁定特定活动的方向。但是,这是在API级别18中添加的,因此仅限于新设备。有关详细信息,请参阅清单documentation

答案 1 :(得分: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)。

答案 2 :(得分: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
        }