Как получить доступ к данным акселерометра / гироскопа из Javascript?


недавно я столкнулся с несколькими веб-сайтами, которые, похоже, получают доступ к акселерометру или гироскопу на моем ноутбуке, обнаруживая изменения в ориентации или движении.

Как это сделать? Должен ли я подписаться на какое-то событие на

3 122

3 ответа:

в настоящее время существует три различных события, которые могут или не могут быть вызваны при перемещении клиентских устройств. Два из них сосредоточены вокруг ориентация и последний движение:

  • ondeviceorientation известно, что он работает на настольной версии Chrome, и большинство ноутбуков Apple, похоже, имеют оборудование, необходимое для этой работы. Он также работает на мобильном Safari на iPhone 4 с iOS 4.2. В функции обработчика событий вы можете доступ alpha,beta,gamma значения в данных события, предоставленных в качестве единственного аргумента функции.

  • onmozorientation поддерживается в Firefox 3.6 и новее. Опять же, это, как известно, работает на большинстве ноутбуков Apple, но может работать и на машинах Windows или Linux с акселерометром. В функции обработчика событий найдите x,y,z поля в данных события, предоставленных в качестве первых аргумент.

  • ondevicemotion как известно, работает на iPhone 3GS + 4 и iPad (как с iOS 4.2), и предоставляет данные, связанные с текущим ускорением клиентского устройства. Данные события, переданные в функцию обработчика, имеют acceleration и accelerationIncludingGravity, который имеет три поля для каждой оси: x,y,z

на веб-сайте образца "обнаружение землетрясений" используется серия if инструкции, чтобы выяснить, какое событие прикрепить к (в несколько приоритетном порядке) и передает полученные данные в общий tilt функция:

if (window.DeviceOrientationEvent) {
    window.addEventListener("deviceorientation", function () {
        tilt([event.beta, event.gamma]);
    }, true);
} else if (window.DeviceMotionEvent) {
    window.addEventListener('devicemotion', function () {
        tilt([event.acceleration.x * 2, event.acceleration.y * 2]);
    }, true);
} else {
    window.addEventListener("MozOrientation", function () {
        tilt([orientation.x * 50, orientation.y * 50]);
    }, true);
}

постоянные коэффициенты 2 и 50 используются для "выравнивания" показаний двух последних событий с показаниями первого, но это ни в коем случае точные представления. Для этого простого "игрушечного" проекта он работает просто отлично, но если вам нужно использовать данные для чего-то чуть более серьезного, вам придется ознакомиться с единицами значений представленная в различных мероприятиях и относиться к ним с уважением :)

не могу добавить комментарий к отличному объяснению в другом сообщении, но хотел бы упомянуть, что отличный источник документации можно найти здесь.

достаточно зарегистрировать функцию события для акселерометра вот так:

if(window.DeviceMotionEvent){
  window.addEventListener("devicemotion", motion, false);
}else{
  console.log("DeviceMotionEvent is not supported");
}

обработчик:

function motion(event){
  console.log("Accelerometer: "
    + event.accelerationIncludingGravity.x + ", "
    + event.accelerationIncludingGravity.y + ", "
    + event.accelerationIncludingGravity.z
  );
}

а для магнитометра должен быть зарегистрирован следующий обработчик событий:

if(window.DeviceOrientationEvent){
  window.addEventListener("deviceorientation", orientation, false);
}else{
  console.log("DeviceOrientationEvent is not supported");
}

с обработчиком:

function orientation(event){
  console.log("Magnetometer: "
    + event.alpha + ", "
    + event.beta + ", "
    + event.gamma
  );
}

также указаны поля в случае движения для гироскопа, но это, похоже, не поддерживается повсеместно (например, он не работал на Samsung Galaxy Note).

есть простой рабочий код на GitHub

полезный запасной вариант здесь:https://developer.mozilla.org/en-US/docs/Web/Events/MozOrientation

function orientationhandler(evt){


  // For FF3.6+
  if (!evt.gamma && !evt.beta) {
    evt.gamma = -(evt.x * (180 / Math.PI));
    evt.beta = -(evt.y * (180 / Math.PI));
  }

  // use evt.gamma, evt.beta, and evt.alpha 
  // according to dev.w3.org/geo/api/spec-source-orientation


}

window.addEventListener('deviceorientation',  orientationhandler, false);
window.addEventListener('MozOrientation',     orientationhandler, false);