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