浏览器 API 之设备姿态

2017-02-25 11:39 #旧文章

本文翻译自 MDN,原文版本为 Aug 5, 2015, 5:03:11 PM

警告

这是一个试验性 API
鉴于该 API 尚未稳定,为了能在不同的浏览器上运行,请参考下文的兼容性表。
同时请注意,试验性 API 在不同浏览器上的行为可能会存在差异,并且可能在未来会有更改。

渐渐地,一些上网设备支持了设备姿态的探测,这为使得用户在旋转手机时设备上的显示也会随之转动。手机就是其中一类这种设备。

现在有两个可以处理设备姿态的 JavaScript 事件。第一个是 DeviceOrientationEvent,当设备感知到了姿态的变化,这个事件就会被触发。通过处理事件中附带的信息,网页可以动态地改变显示的朝向。

第二个事件是 DeviceMotionEvent,当设备的加速度发生变化时,这个事件会被触发。该事件不同于 DeviceOrientationEvent,该事件是在加速度发生改变时而不是方向发生改变时被触发。DeviceMotionEvent 通常被用于保护移动中的存储设备。DeviceOrientationEvent 则更多地存在于手机上。

处理旋转事件

你需要监听 deviceorientation 来获取这些事件。、

提示

gyronorm.js 提供了加速度传感器和陀螺仪的一个通用接口。这对于消除浏览器之间的不同支持情况提供了便利。

window.addEventListener("deviceorientation", handleOrientation, true);

在注册了事件监听器之后,该监听函数会不断的被调用。该事件提供了以下信息:

事件处理函数可以像这样:

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
}

事件内键值的解释

事件内的每一个键都对应着一个坐标上的旋转程度。更为详细的解释请看 Orientation and motion data explained

我会抽时间画一张表示图。

示例

下面的示例可以在支持 deviceorientation 事件的浏览器上运行,当然设备要有相应的传感器。

源代码及在线运行的示例请转至 MDN

小心

Chrome 和 Firefox 在处理角度上的方式不同,所以有一些轴的数值会相反。

处理运动事件

运动事件和旋转事件类似,它的事件名是 devicemotion

window.addEventListener("devicemotion", handleMotion, true);

DeviceMotionEvent 事件内的键值如下

运动事件的键值解释

DeviceMotionEvent 事件提供了设备的加速度等信息。这些信息分成三个轴来表示。

accelerationaccelerationIncludingGravity 由下面的轴构成:

  • x:表示从东到西的轴。
  • y:表示从南到北的轴。
  • z:表示垂直地面的轴。

rotationRate 由下面的轴构成:

  • alpha:表示了设备绕垂直于地面的轴的旋转速度。
  • beta:表示了设备绕设备顶部边缘的旋转速度。
  • gamma:表示了设备绕设备侧边的旋转速度。

最后,interval 表示了时间间隔,以毫秒为单位。

规范

规范状态备注
Device Orientation Events正在处理的草案原始规范

浏览器兼容性

桌面系统特性ChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
DeviceOrientationEvent7.03.6 1 6???
DeviceMotionEvent(Yes)6???
手机系统特性AndroidFirefox Mobile (Gecko)IE PhoneOpera MobileSafari Mobile
DeviceOrientationEvent3.03.61 6不支持不支持4.2
DeviceMotionEvent(Yes)6???
  1. Firefox 3.6 至 5 支持 mozOrientation 而不是标准的 DeviceOrientationEvent

参考资料