【问题标题】:Android: stack of disabled orientation changesAndroid:禁用方向更改堆栈
【发布时间】:2014-02-04 20:01:53
【问题描述】:

我的应用程序设计为“仅限横向”。必须支持左右横向之间的旋转,所以我使用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;
}

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

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

【问题讨论】:

  • 小游戏是否使用单独的活动?
  • @Submersed 没有。无论如何,如果我使用单独的活动有什么帮助?

标签: android android-orientation


【解决方案1】:

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

【讨论】:

  • 是的,SCREEN_ORIENTATION_LOCKED 看起来很有希望(尽管我没有尝试过)。但正如你提到的 API 级别 18 对我来说是一个停止标志。我必须支持 API 级别 >= 10。
【解决方案2】:

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

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

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

如果您在左侧推动设备(使其向右移动),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)。

【讨论】:

  • 感谢您的解释,但它没有回答我的问题“如何锁定设备方向?”。
  • 您的小游戏需要将设备旋转 180 度?
  • 我的小游戏不想在玩家倾斜他的设备时被颠倒过来。是的,设备倾斜是这个小游戏的一部分。
【解决方案3】:

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

        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
  • 你看过这个堆栈帖子吗?尝试浏览博客链接,看看是否有帮助stackoverflow.com/a/6021094/855303
  • 他们建议使用getRotation。它在一般情况下不起作用。我已经检查过了——见我问题的最后一段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 2011-04-06
  • 2012-10-21
  • 2011-04-04
  • 1970-01-01
  • 2021-06-15
相关资源
最近更新 更多