在不使用监听器的情况下获取设备方向(alpha,beta,gamma)?

时间:2015-12-28 18:13:13

标签: javascript html5 device-orientation

我使用window.DeviceOrientationEvent来监听设备方向的变化。但是,我想校准我的应用程序,以将方向更改 relative 报告给原始方向。为此,我提出了以下解决方案:

originalOrientation.freeze = false;
window.addEventListener('deviceorientation', function(e){
            var orientation = {g: Math.round(e.gamma), b: Math.round(e.beta), a: Math.round(e.alpha), o: window.orientation || 0};
            if(!originalOrientation.freeze){
                originalOrientation = orientation;
                originalOrientation.freeze = true;
            }
        });

这基本上取了deviceorientation监听器返回的第一个值"冻结"所以它不会不断更新。我不喜欢这种方法,因为我宁愿在我的代码中的其他地方进行校准,而不是在收集实际方向的地方。我也不想连接两次监听器,因为回调中返回的值将丢失。

TLDR;

有没有办法可以调用类似window.getDeviceOrientation()的内容来同步返回alpha,beta和gamma值而不是附加回调?

1 个答案:

答案 0 :(得分:2)

我认为full-tilt库可以为您实现这一目标。

在github页面上有一个简单的例子,它显示了如何初始化基于promises的库,然后在你的逻辑中,你只需要在调用一个方法之前检查设备方向对象是否存在(IE是否履行了承诺)为deviceOrientation.getScreenAdjustedEuler()

你不必像他们的例子一样使用动画循环。

另外,您可以在不丢失数据的情况下添加和删除事件侦听器。我肯定会这样做,而不是通过冻结禁用监听器。我根据需要添加和删除监听器一段时间以获得初始状态以便在以后需要不断更新时进行比较(或者更准确地说,当不需要时不订阅事件)。尽管如此,我还是会全力以赴。我使用它是因为它提供了跨设备的规范化数据,但它几乎可以满足您的需求,并且可能会使您的代码更整洁。

如果你在5个月之后还在继续工作,那么,这对于现在狩猎的人来说可能更有用。