0

我有一项任务,我必须将设备(而非活动)方向转换为 4 个值(LANDSCAPE、PORTRAIT、LANDSCAPE_REVERTED 和 PORTRAIT_REVERTED)。我想出了一个解决方案,但它使用固定值,并不代表它如何以及何时改变活动方向的 android 功能。

我找不到可以轻松通知侦听器何时设备已将其方向更改为指定的 4 个值的 api。

如果有人可以分享 android 如何计算方向并通知 WindowManager 更改活动方向的功能,那将是非常高兴的。

[已解决] 谁可能最终遇到与我相同的情况。 框架/基础/核心/java/android/view/WindowOrientationListener.java

此侦听器包含通知活动更改其方向的所有魔法。

4

5 回答 5

1

在 onConfigChanges() 中,每当您的屏幕方向发生变化时,您总是会收到通知,并且您始终可以像这样获得您的屏幕方向:

Display getOrient = getWindowManager().getDefaultDisplay();
switch(orientation){
case Configuration.ORIENTATION_LANDSCAPE:
Log.e();
break;
case Configuration.ORIENTATION_PORTRAIT:
Log.e();
break;
}
于 2013-03-01T11:07:07.930 回答
0

在项目清单中使用 screenOrientation 并设置方向。

<activity
            android:name=".SplashScreen"
            android:screenOrientation="portrait"
</activity>
于 2013-03-01T11:03:11.947 回答
0

如果您希望活动在横向模式下显示和对齐,则在可绘制文件夹中添加一个文件夹,即 layout-landscape 如果您希望应用程序仅在纵向模式下运行,则在清单中声明如下

android:screenOrientation="portrait"

或者你想要横向模式:

 android:screenOrientation="landscape"
于 2013-03-01T11:05:53.100 回答
0

我很确定操作系统会计算设备的旋转并在旋转角度改变 60 度时改变方向。因此,如果设备处于纵向且旋转角度等于 0,则当设备逆时针旋转时,旋转角度会增加,当旋转角度约为 60 度时,操作系统将变为横向。现在假设当您顺时针旋转设备时设备处于横向,角度会减小,大约 30 度时操作系统将变为纵向。

方向改变状态
左侧是当前方向。
右侧是设备旋转时的新方向。
Portrait ---> Landscape 旋转逆时针旋转角度 > 60
Portrait ---> Landscape_Reverse 顺时针旋转角度 < -60
Landscape ---> 纵向旋转顺时针旋转角度 < 30
Landscape ---> Portrait_Reverse逆时针旋转角度 > 150
Landscape_Reverse ---> 纵向旋转逆时针旋转角度> -30
Landscape_Reverse ---> Portrait_Reverse顺时针旋转角度< -150

设备平放时无法计算旋转角度。这就是为什么如果您在设备平放时启动应用程序并旋转设备,则不会发生方向变化。
您可以在我的回答中查看如何计算旋转角度:如何使用 Android 中的加速度计测量手机在 XY 平面中的倾斜度

于 2013-03-01T11:27:36.553 回答
0

使用getRotation()

Display display = ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
int rotation = display.getRotation();

从文档

从“自然”方向返回屏幕的旋转。返回值可能是 Surface.ROTATION_0(无旋转)、Surface.ROTATION_90、Surface.ROTATION_180 或 Surface.ROTATION_270。例如,如果设备具有自然高的屏幕,并且用户已将其侧放以进入横向,则此处返回的值可能是 Surface.ROTATION_90 或 Surface.ROTATION_270,具体取决于它的转动方向。角度是所绘制图形在屏幕上的旋转,与设备的物理旋转方向相反。例如,如果设备逆时针旋转 90 度,为了补偿渲染将顺时针旋转 90 度,因此这里的返回值将是 Surface.ROTATION_90。

于 2013-03-01T11:32:22.900 回答