【问题标题】:Normalize deviceorientation data规范化设备方向数据
【发布时间】:2013-07-02 16:24:48
【问题描述】:

我在 JavaScript 中使用 deviceorientation,我注意到我的 Ipad (iOS 6.1) 和我的 Nexus7 (Android 4.2.2) 之间存在一些差异。

此代码与 Ipad 和 Nexus7 打印的数据不同。

<html>
  <head/>
  <body>
    <button id="calibrate">Calibrate</button>
    <button id="stop">Stop</button>
    <button id="play">Play</button>
    <div id="log"><p></p></div>
    <script>
      var log = document.getElementById('log');
      var calibrate = false;
      var calibrateG = 0, calibrateB = 0, calibrateA = 0;

      var deviceorientation = function(e) {
        if (calibrate) {
          calibrateG = e.gamma;
          calibrateB = e.beta;
          calibrateA = e.alpha;
          calibrate = false;
        }

        var gamma = parseInt(e.gamma - calibrateG);
        var beta = parseInt(e.beta - calibrateB);
        var alpha = parseInt(e.alpha - calibrateA);

        var p = document.createElement('p');
        p.innerHTML = gamma + ' ' + beta + ' ' + alpha;
        log.insertBefore(p, log.firstChild);
      }

      document.getElementById('stop').onclick = function() {
        window.removeEventListener('deviceorientation', deviceorientation);
      };
      document.getElementById('play').onclick = function() {
        window.addEventListener('deviceorientation', deviceorientation);
      };
      document.getElementById('calibrate').onclick = function() {
        calibrate = true;
      };

      window.addEventListener('deviceorientation', deviceorientation);

    </script>
  </body>
</html>

在开始时,Android 打印 0 0 270 和 iOS 0 0 0。

然后,当我以相同的方式移动两者时,它们不会打印相同的值。

谁能解释原因,以及是否有办法规范化数据。

更新 #1

我已经尝试了一些校准,并且我关心横向/纵向。 要复现,你可以拿上面的代码,把ipad和nexus7竖着放在你面前。 校准两者的值(第一个按钮)。 然后取数位板的右上角并旋转它,直到数位板达到 90 度。 平板电脑应该在左侧。

在 Android 上,伽玛值从 0 变为 -80,然后跳至 270。 在 IOS 上,gamma 从 0 变为 -180,没有任何跳跃。

【问题讨论】:

    标签: javascript android ios gyroscope device-orientation


    【解决方案1】:

    Full Tilt JS 标准化 Android 和 iOS 设备方向实现之间的数据值。它还确保用户旋转屏幕时设备方向数据保持一致。

    This article 总结了 Full Tilt JS 库中使用的一些技术。

    免责声明:我是上述文章和图书馆的作者。请尝试一下并直接在 Github 项目上报告任何问题。

    【讨论】:

      【解决方案2】:

      如果您在应用程序或游戏中需要所有这三个,您可以提示用户~“将设备保持直立”并记录初始值,然后获取这些值的偏移量(增量)。您甚至可以将初始校准保存到 localStorage,这样就不需要重复了。

      如果您只需要横向或纵向,只需将 window.innerWidth 与 window.innerHeight 或其他类似的东西进行比较。

      【讨论】:

      • 我已经尝试校准值并且我关心风景肖像。我更新了我的帖子,也许它更清楚了。
      • @charles - 忘记 alpha、beta、gamma 并使用简单的东西,例如 //// var orientation = window.innerWidth > window.innerHeight ? “横向纵向”; ////
      • 我想知道用户何时翻转/倾斜/摇动手机,所以我需要 alpha、beta、gamma。关于“我关心风景肖像”,我想说我已经知道风景/肖像会影响 alpha、beta、gamma。
      • @charles - 一个浏览器不支持当前规范,另一个支持。例如 Mozilla (developer.mozilla.org/en-US/docs/WebAPI/…) 有 alpha [0, 360] beta[-180, 180] gamma[-90, 90]。您校准的方式需要考虑这些范围。
      • 我认为 Firefox 的做法是正确的:dev.w3.org/geo/api/spec-source-orientation.html 感谢您的回复。
      猜你喜欢
      • 2013-01-18
      • 2011-11-20
      • 1970-01-01
      • 2011-07-25
      • 2011-04-18
      • 2014-10-04
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      相关资源
      最近更新 更多