Android:禁用方向改变堆栈



我的应用程序被设计为"景观"。必须支持左右横向之间的旋转,所以我使用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_0Surface.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中暂时锁定方向变化?

你可以通过在android清单中声明screenOrientation="locked"来锁定特定活动的方向,或者通过使用编程等效的ActivityInfo.SCREEN_ORIENTATION_LOCKED。然而,这是在API级别18中添加的,所以它仅限于新设备。

强制方向不会禁用加速度计/陀螺仪传感器,所以你不需要移除方向锁定。

但是,您应该注意传感器给出的值是在标准传感器坐标系中:

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

如果你在左边推动设备(所以它移动到右边),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)。

您可以使用以下代码获取当前方向并锁定它。

        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
        }

最新更新