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

Get device orientation (alpha, beta, gamma) without using listener?

本文关键字:alpha 方向 beta gamma 侦听器 获取 情况下      更新时间:2023-09-26

我正在使用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值,而不是附加回调?

我认为全倾斜库可以为您实现这一点。

github页面上有一个简单的例子,展示了如何初始化他们基于promise的库,然后在您的逻辑中,在调用deviceOrientation.getScreenAdjustedEuler()等方法之前,只需检查设备定向对象是否存在(即promise是否已实现)。

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

顺便说一句,您本可以在不丢失数据的情况下添加和删除事件侦听器。我肯定会这么做,而不是用冻结来禁用侦听器。一段时间以来,我一直在根据需要添加和删除侦听器,以获得初始状态,以便在以后需要不断更新时进行比较(或者更准确地说,在不需要更新时不订阅事件)。不过我还是会全力以赴。我使用它是因为它在设备之间提供了标准化的数据,但它几乎可以满足你的需求,可能会让你的代码更整洁。

如果5个月后你还在做这件事,是的,这可能对现在四处狩猎的人更有用处。