如何检测屏幕旋转?

15

我有一个显示指南针的活动,并且需要知道屏幕的方向以正确旋转指针。我需要区分90度和270度的旋转,以正确处理这个问题。

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

然而,当我将底部边缘向上旋转180度时,屏幕不会触发onCreate。在这种情况下,是否有触发的事件?


那个关于另一个问题的回答对我帮助更大。 - OneWorld
5个回答

11

您的观点是正确的,当屏幕旋转 180 度时,您不会重新启动或更改配置,因为配置实际上并没有改变。(它仍处于横向或纵向,并且其他所有内容都相同。)

但是,如果您正在显示罗盘,则必须意味着您正在从传感器事件进行更新。因此,每次获取传感器更新时,您可以调用 Display.getRotation() 来获取屏幕的当前旋转角度。事实上,您需要的是解释传感器事件的旋转方向(或者实际上是在屏幕上绘制它们时将如何被修改),而不仅仅是方向。

我找到了一篇相关的博客文章,非常值得阅读。

(阅读原文)

请务必阅读 SDK 文档。

(阅读原文)

还请查看有关使用 Display.getRotation() 正确重映射传感器坐标的讨论。

(阅读原文)

Hackbot,感谢你指引我正确的方向。现在我正在检查每个传感器事件的屏幕旋转并在其更改时更新传感器对齐。这样做是有效的,但我认为我现在在处理无关的事情:理论上可能会发生屏幕方向改变但没有传感器事件的情况,但我想这是目前最好的选择。 - Michael

6

谢谢!如果您的应用程序被锁定为一个UI布局方向,那真的很好用! - bk138
1
你把它连接在哪里? - Nilzor

0

只需查看传感器管理器文档,您就可以获得如何使用加速度计获取最精确信息的最佳示例和解释。与仅通过检测手机方向来完成任务不同,使用该API,您可以获得完全旋转,就像赛车游戏Asphalt和Need For Speed所使用的一样。


这对游戏来说没问题,但在常规应用程序中处理旋转的规范方式并非如此。相反,Android 应用程序应订阅配置更改(例如屏幕旋转)并相应地采取行动。 - Julio Gorgé
抱歉我的问题有点混淆,实际上是关于屏幕旋转事件而不是传感器读数的。 - Michael

0
如Monchote所说,为了使您的指针在指南针上按预期旋转,最好将您的UI锁定为纵向或横向,并根据设备旋转角度更改指针角度,这可以轻松从OrientationListener中获得。
通过这种方式,无论用户是否打开自动旋转功能,您都可以始终获得旋转角度变化通知。 这里有一个很好的例子供您参考。

-2

2
Julio,这个方法在我的特殊情况下有同样的缺陷,它没有被调用 :-( - Michael
1
如果您想要接收配置更改的通知,您需要修改清单文件。默认行为是完全拆除并重建应用程序,这就是为什么会调用onCreate()方法。一般来说,最好保持这种方式。正确处理配置更改非常困难。 - Edward Falk
1
因为在OP描述的情况下,OnConfigurationChanged方法并未被调用,所以被踩了。 - Pooks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接