Нормализация данных об ориентации устройства

Я играю с ориентацией устройства в JavaScript и заметил некоторые различия между моим 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 гамма изменяется от 0 до -180 без каких-либо скачков.


person Charles    schedule 02.07.2013    source источник


Ответы (2)


Если вам нужны все три для приложения или игры, вы можете предложить пользователю ~ «удерживать устройство прямо» и записать начальные значения, а затем получить смещения (дельты) этих значений. Вы даже можете сохранить эту первоначальную калибровку в localStorage, чтобы ее не нужно было повторять.

Если все, что вам нужно, это пейзаж или портрет, просто сравните window.innerWidth с window.innerHeight или что-то столь же тривиальное.

person Louis Ricci    schedule 02.07.2013
comment
Я уже пытаюсь откалибровать значение, и меня волнует пейзажный портрет. Я обновил свой пост, может быть, он понятнее. - person Charles; 02.07.2013
comment
@charles - забудьте об альфе, бета, гамме и просто используйте что-то простое, например //// var ориентация = window.innerWidth › window.innerHeight ? картина ландшафта; //// - person Louis Ricci; 02.07.2013
comment
Я хочу знать, когда пользователь переворачивает/наклоняет/встряхивает телефон, поэтому мне нужны альфа, бета, гамма. Говоря о пейзажном портрете, я хотел сказать, что уже знаю, что пейзаж/портрет влияет на альфа, бета, гамму. - person Charles; 03.07.2013
comment
@charles - один браузер не поддерживает текущую спецификацию, а другой поддерживает. Например, Mozilla (developer.mozilla.org/en-US/docs/WebAPI/) имеет альфа [0, 360] бета [-180, 180] гамма [-90, 90]. Способ калибровки должен учитывать эти диапазоны. - person Louis Ricci; 03.07.2013
comment
Я думаю, что Firefox делает это правильно: dev.w3 .org/geo/api/spec-source-orientation.html Спасибо за ответ. - person Charles; 04.07.2013

Full Tilt JS нормализует значения данных между реализациями ориентации на устройства Android и iOS. Это также гарантирует, что данные об ориентации устройства остаются согласованными всякий раз, когда пользователь поворачивает свой экран.

В этой статье представлен обзор некоторых методов, использованных в Полном Наклоните JS-библиотеку.

Отказ от ответственности: я являюсь автором как статьи, так и библиотеки выше. Пожалуйста, попробуйте и сообщите о любых проблемах непосредственно в проекте Github.

person richt    schedule 16.09.2014