3

我的应用程序设计为“仅限横向”。必须支持左右横向之间的旋转,所以我使用android:screenOrientation="sensorLandscape".

但是,当必须完全禁用旋转时,我的应用程序中有一个迷你游戏(因为这个迷你游戏将由设备 tlting 控制)。小游戏结束后,方向处理策略必须恢复为sensorLandscape.

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

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);

但情况并非如此!正如这里提到的(并由我检查),它导致方向更改为默认状态(可能是纵向)。

因此,从“disableRotation”变为“disableRotation”的唯一方法sensorLandscape是明确设置所需的方向。所以我有一个选择:要么打电话

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

或者

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE);

显然,我需要传递一个当前的方向,但似乎Android没有函数来获取它!

getResources().getConfiguration().orientation要么返回要么Configuration.ORIENTATION_PORTRAIT没用Configuration.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 中临时锁定方向更改?

4

3 回答 3

1

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

于 2014-02-03T19:59:03.633 回答
0

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

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

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

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

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

固定设备的加速度值为 +9.81,对应于设备的加速度(0 m/s2 减去重力,即 -9.81 m/s2)。

于 2014-01-28T14:24:39.597 回答
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
        }
于 2014-02-04T12:01:53.047 回答