在javascript中确定移动设备上的哪个方向已关闭?

时间:2014-04-10 16:36:37

标签: javascript android ios accelerometer box2dweb

我正在使用Box2D创建一个工具,并希望了解是否有办法匹配移动设备上的真实重力方向。

我通过绑定到devicemotion事件在iPad上完成了这项工作。我检查窗口的宽度是否大于其高度,以确定用户是否以横向或纵向模式握住设备,并根据该事实转换加速度计提供的数据。例如,如果使用主页按钮将iPad保持在设备底部,则y为负值,并且与您可能期望的重力相对应。如果设备向左或向右旋转90度,则y向0移动,x增加到9.8或减小到-9.8。

问题在于,当我移动到默认情况下方向为横向的Android设备时(即设备的硬件以明确的方式排列,主要用于横向) x和y坐标是相反的,并且窗口高度大于其宽度的事实不能用于确定用户是否正握住设备的顶部"向上"及其底部"向下"。

我是否有更通用的方法来确定设备的方向,因此知道如何解释加速度计数据以使我的引力始终相对于地球?

以下是我用来确定属性值的方法的快速摘录。

window.addEventListener('devicemotion', function(e) { console.log(e.accelerationIncludingGravity.x); console.log(e.accelerationIncludingGravity.y); })

1 个答案:

答案 0 :(得分:0)

在剩下的时间里完成这个工作后,看起来答案是你需要为windowchange事件添加一个监听器(以及resize事件,因为某些Android设备不会触发orientationchange)然后检查window.orientation,它基于方向为0,180或+/- 90。

var orientation = window.orientation;

//Optionally add an evenr listener on resize here
window.addEventListener('devicemotion', function() {
    if(Math.abs(orientation) == 90) {
        //device is sideways
    } else {
        //device is vertical
    }
});

window.addEventListener('orientationchange', function(e) {
    if(PanScaleTool.scaleToolData.accelerometer == true) {

        if(Math.abs(e.beta) > 45) {
            orientation = window.orientation;
        } else {
            orientation = window.orientation;
        }
    }
});

在我使用iOS设备和两个Android设备的有限测试中,0和180似乎总是对应于设备是垂直的(例如在屏幕顶部的前置摄像头)或颠倒。 +/- 90对应于其他两个方向。

Here's another question on SO that I referenced for this answer