Как получить доступ к данным акселерометра / гироскопа из Javascript?
недавно я столкнулся с несколькими веб-сайтами, которые, похоже, получают доступ к акселерометру или гироскопу на моем ноутбуке, обнаруживая изменения в ориентации или движении.
Как это сделать? Должен ли я подписаться на какое-то событие на
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);