최근에 랩톱의 가속도계 또는 자이로 스코프에 액세스하여 방향 또는 움직임의 변화를 감지하는 웹 사이트를 발견했습니다.
이것은 어떻게 이루어 집니까? window
객체 에서 어떤 종류의 이벤트를 구독해야 합니까?
어떤 기기 (노트북, 휴대 전화, 태블릿)에서 작동하는 것으로 알려져 있습니까?
NB : 나는 이미이 질문에 대한 답을 이미 알고 있으며 바로 게시 할 것입니다. 여기에 질문을 게시하는 이유는 가속도계 데이터 가 Javascript (일부 장치)로 제공되고 해당 커뮤니티에서 해당 주제에 대한 새로운 결과를 게시하도록 요청하는 것입니다. 현재 이러한 기능에 대한 문서는 거의없는 것 같습니다.
답변
2019+에서이를 수행하는 방법은 DeviceOrientation
API 를 사용하는 것 입니다. 데스크톱 및 모바일의 최신 브라우저 에서 작동합니다 .
window.addEventListener("deviceorientation", handleOrientation, true);
이벤트 리스너 (이 경우 handleOrientation ()라는 JavaScript 함수)를 등록한 후 리스너 함수는 업데이트 된 방향 데이터와 함께 주기적으로 호출됩니다.
오리엔테이션 이벤트에는 네 가지 값이 포함됩니다.
DeviceOrientationEvent.absolute
DeviceOrientationEvent.alpha
DeviceOrientationEvent.beta
DeviceOrientationEvent.gamma
이벤트 핸들러 함수는 다음과 같습니다.
function handleOrientation(event) { var absolute = event.absolute; var alpha = event.alpha; var beta = event.beta; var gamma = event.gamma; // Do stuff with the new orientation data }
답변
현재 클라이언트 장치가 움직일 때 트리거되거나 트리거되지 않을 수있는 세 가지 별개의 이벤트가 있습니다. 그중 두 가지는 오리엔테이션 에 초점을 맞추고 마지막은 모션 에 중점을 둡니다 .
-
ondeviceorientation
데스크톱 버전의 Chrome에서 작동하는 것으로 알려져 있으며 대부분의 Apple 노트북에는 작동하는 데 필요한 하드웨어가있는 것으로 보입니다. iOS 4.2가 설치된 iPhone 4의 Mobile Safari에서도 작동합니다. 이벤트 핸들러 함수에서 액세스 할 수있는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에서 작동하지 않음).
답변
유용한 대체 방법은 다음과 같습니다. 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);