我正在使用 window.DeviceOrientationEvent
来监听设备方向的变化。但是,我想校准我的应用程序以报告相对于原始方向的方向变化。为了做到这一点,我提出了以下解决方案:
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 值,而不是附加回调?
最佳答案
我认为full-tilt图书馆将为您实现这一点。
github 页面上有一个简单的示例,展示了如何初始化基于 Promise 的库,然后在您的逻辑中,您只需在调用诸如 之类的方法之前检查设备方向对象是否存在(即 Promise 已实现) >deviceOrientation.getScreenAdjustedEuler()
。
您不必像示例中那样使用动画循环。
顺便说一句,您可以添加和删除事件监听器而不会丢失数据。我肯定会这样做,而不是通过卡住来禁用监听器。我暂时根据需要添加和删除监听器,以获得初始状态,以便与以后需要不断更新时进行比较(或者更准确地说,在不需要事件时不订阅事件)。不过,我仍然会选择全倾斜。我使用它是因为它提供了跨设备的标准化数据,但它几乎可以满足您的需求,并且可能会使您的代码更加整洁。
如果 5 个月后您仍在研究它,那么这对于现在正在寻找的人来说可能更有用。
关于javascript - 在不使用监听器的情况下获取设备方向(alpha、beta、gamma)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34498567/