首页 文章

如何从Javascript访问加速度计/陀螺仪数据?

提问于
浏览
124

我最近遇到过一些似乎可以访问我的笔记本电脑上的加速度计或陀螺仪的网站,检测方向或运动的变化 .

这是怎么做到的?我必须订阅 window 对象上的某种事件吗?

已知这些设备(笔记本电脑,手机,平板电脑)有效吗?


注意:我实际上已经知道(部分)这个问题的答案,我将立即发布 . 我在这里发布问题的原因是让其他人知道加速度计数据在Javascript(在某些设备上)可用,并挑战社区发布关于该主题的新发现 . 目前,似乎几乎没有这些功能的文档 .

3 回答

  • 174

    当客户端设备移动时,当前可能会或可能不会触发三个不同的事件 . 其中两个专注于定位,最后一个专注于动作:

    • ondeviceorientation 已知可用于桌面版Chrome,大多数Apple笔记本电脑似乎都具备此功能所需的硬件 . 它也适用于iOS 4的iPhone 4上的Mobile Safari . 在事件处理函数中,您可以访问作为函数唯一参数提供的事件数据上的 alphabetagamma 值 .

    Firefox 3.6及更高版本支持

    • onmozorientation . 同样,这在大多数Apple笔记本电脑上都可以使用,但也可以在带有加速度计的Windows或Linux机器上运行 . 在事件处理程序函数中,查找作为第一个参数提供的事件数据上的 xyz 字段 .

    已知

    • ondevicemotion 适用于iPhone 3GS 4和iPad(均采用iOS 4.2),并提供与客户端设备当前加速相关的数据 . 传递给处理函数的事件数据有 accelerationaccelerationIncludingGravity ,每个轴都有三个字段: xyz

    "earthquake detecting"示例网站使用一系列 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用于来自后两个事件的读数与来自第一个事件的读数,但这些并不是精确的表示 . 对于这个简单的"toy"项目它运行得很好,但是如果你需要将数据用于稍微更严重的事情,那么你必须熟悉不同事件中提供的值的单位并尊重它们:)

  • 19

    无法在其他帖子的优秀解释中添加注释,但想提一下,可以找到一个很棒的文档源here .

    为加速度计注册事件函数就足够了,如下所示:

    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
      );
    }
    

    在陀螺仪的运动事件中也有指定的字段,但似乎并不普遍支持(例如,它不适用于三星Galaxy Note) .

    GitHub上有一个简单的工作代码

  • 1

    有用的后备: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);
    

相关问题