【问题标题】:Casting device orientation to LANDSCAPE, PORTRAIT, LANDSCAPE_REVERTED and PORTRAIT_REVERTED将设备方向投射到 LANDSCAPE、PORTRAIT、LANDSCAPE_REVERTED 和 PORTRAIT_REVERTED
【发布时间】:2013-03-01 10:59:08
【问题描述】:

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

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

如果有人能分享 android 如何计算方向并通知 WindowManager 改变活动方向的功能,那就太棒了。

[已解决] 做谁可能最终陷入与我相同的境地。 frameworks/base/core/java/android/view/WindowOrientationListener.java

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

【问题讨论】:

    标签: android math


    【解决方案1】:

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

    Display getOrient = getWindowManager().getDefaultDisplay();
    switch(orientation){
    case Configuration.ORIENTATION_LANDSCAPE:
    Log.e();
    break;
    case Configuration.ORIENTATION_PORTRAIT:
    Log.e();
    break;
    }
    

    【讨论】:

    • 这将读取最顶部的活动方向。不是设备活动。 (并且只将其投射到两个方向)。
    【解决方案2】:

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

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

    设备平放时无法计算旋转角度。这就是为什么如果您在设备平放时启动应用程序并旋转设备,则不会发生方向变化。
    您可以在How to measure the tilt of the phone in XY plane using accelerometer in Android@ 的回答中查看旋转角度的计算方式

    【讨论】:

    • 请告诉我,您在哪里找到了有关 60 度和 30 度的信息。我一直在浏览android源代码,找不到。此外,您的解决方案似乎很有希望。
    • 我写了一个应用程序来计算旋转角度并在 UI 中显示旋转角度。当我旋转设备时,操作系统会按照答案中的说明更改方向。
    • 同时使用两个轴倾斜设备时似乎存在问题(它与实际的活动方向变化不相似)。此外,您的方向更改状态缺少 Portrait_Revers ---> Landscape && Portrait_Revers ---> Landscape_Reverse。
    • 2个轴同时是什么意思?我可以将我的应用程序发送给您以供您测试。
    • 使用滚动和俯仰。设备的左上角朝下。无论如何,您的解决方案似乎有效,但并不完美。有时人像 --> 风景有不同的“转向”角度。有时是 80 有时是 40。取决于其他轴。
    【解决方案3】:

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

    <activity
                android:name=".SplashScreen"
                android:screenOrientation="portrait"
    </activity>
    

    【讨论】:

    【解决方案4】:

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

    android:screenOrientation="portrait"
    

    或者你想要横向模式:

     android:screenOrientation="landscape"
    

    【讨论】:

    • 不是为了设备方向。
    【解决方案5】:

    使用 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 取决于它转动的方向。这 angle 是绘制的图形在屏幕上的旋转角度,即 与设备的物理旋转方向相反。为了 例如,如果设备逆时针旋转 90 度,则 补偿渲染将顺时针旋转 90 度,因此 这里的返回值为 Surface.ROTATION_90。

    【讨论】:

    • 再次,这是最顶部的活动旋转而不是设备方向的方法。
    • 不,它是显示器/设备的方向。你看有 Surface.ROTATION_0、Surface.ROTATION_90、Surface.ROTATION_180 和 Surface.ROTATION_270
    • 你在实际设备上检查过这个吗?如果您无法区分什么是表面方向和什么是设备方向,请不要打扰回答。
    猜你喜欢
    • 1970-01-01
    • 2014-03-16
    • 2016-10-08
    • 2015-09-08
    • 2018-03-19
    • 2017-08-16
    • 1970-01-01
    • 2020-09-23
    • 2021-09-07
    相关资源
    最近更新 更多