【问题标题】:How do I detect screen rotation如何检测屏幕旋转
【发布时间】:2011-01-30 15:54:19
【问题描述】:

我有一个显示指南针的活动,我需要知道屏幕的方向才能正确旋转指针。我需要区分 90° 和 270° 旋转才能正确处理。

当我旋转屏幕(至少在我的 Nexus S 上)时,活动的 onCreate 被调用,例如当我从纵向模式旋转到横向模式时。当我从一种横向模式旋转到另一种且顶部边缘抬起时,onCreate() 会被调用两次(一次用于纵向,一次用于目标横向模式)。

但是,当我旋转底部边缘向上时,屏幕旋转了 180°,onCreate 没有被调用。在这种情况下是否有事件被触发?

【问题讨论】:

    标签: android screen-rotation


    【解决方案1】:

    您是正确的,在 180 度旋转时您不会重新启动或配置更改,因为配置实际上并没有更改。 (它仍然是横向或纵向的,其他一切都一样。)

    但是,如果您展示的是指南针,那一定意味着您正在根据传感器事件对其进行更新。因此,您可以在每次获得传感器更新时调用 Display.getRotation() 以获取屏幕的当前旋转。事实上,您需要是解释传感器事件的旋转(或者实际上当它到达屏幕时如何修改它们的绘制),而不仅仅是方向。

    我找到了一篇相关的博文,well worth reading

    请务必阅读SDK documentation

    还可以查看 the discussion 关于使用 Display.getRotation() 正确重新映射传感器坐标的信息。

    【讨论】:

    • hackbot,感谢它为我指明了正确的方向。我现在正在检查每个传感器事件的屏幕旋转,并在传感器发生变化时更新传感器对齐。这可行,但我认为我现在正在连接不相关的东西:它可能(理论上)发生屏幕方向在没有传感器事件的情况下发生变化,但由于这只是理论上的可能性,我想这是目前最好的选择。
    【解决方案2】:

    帮助类OrientationEventListener 可以很容易地获得轮换回调。我建议你试一试。

    【讨论】:

    • 谢谢!如果您的应用程序被锁定到一个 UI 布局方向,这确实可以完成工作!
    • 你把它贴在哪里?
    【解决方案3】:

    只需查看SensorManager Documentation,您就可以获得有关如何使用加速度计获取最精确信息的最佳示例和说明。无需仅通过检测手机方向来进行制作,使用该 API 您可以获得精确的旋转,就像 Asphalt 和 Need For Speed 等赛车游戏所使用的那样。

    【讨论】:

    • 这对游戏来说很好,但它不是处理常规应用程序旋转的规范方法。相反,Android 应用应该订阅配置更改(例如屏幕旋转)并采取相应措施。
    • 抱歉让我的问题有点混乱,这实际上是关于屏幕旋转事件,而不是传感器读数。
    【解决方案4】:

    正如Monchote所说,为了让你的指针在指南针上按预期旋转,最好将你的UI锁定为纵向或横向,并根据设备旋转角度改变你的指针角度,可以从OrientationListener 轻松获得。

    这样,无论用户是否开启了自动旋转功能,都可以随时收到旋转角度变化的通知。 Here 是一个很好的例子供您参考。

    【讨论】:

      【解决方案5】:

      查看OnConfigurationChanged 方法以跟踪方向变化并根据需要重新排列您的 UI。

      看到一些sample code

      【讨论】:

      • Julio,这个方法在我的特殊情况下也有同样的缺陷,它没有被调用:-(
      • 如果您想收到配置更改的通知,您需要修改您的清单。默认行为是完全拆除应用程序并重建它,这就是调用 onCreate() 的原因。通常,您希望以这种方式保留它。正确处理配置更改非常困难。
      • 投反对票,因为在 OP 描述的情况下未调用 OnConfigurationChanged。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-18
      相关资源
      最近更新 更多