牛骨文教育服务平台(让学习变的简单)

检测设备方向

7、手机设备方向

7.1 方向

Orientation API用于检测手机的摆放方向(竖放或横放)。

(1)检测浏览器是否支持

if(window.DeviceOrientationEvent){
  //支持
}else{
  //不支持
}

(2)监听方向变化
一旦设备的方向发生变化,会触发deviceorientation事件,可以对该事件指定回调函数。

window.addEventListener("deviceorientation", listener,false);

function listener(event){
  var alpha = event.alpha;
  var beta = event.beta;
  var gamma = event.gamma;
}

上面代码中,event事件对象有alpha、beta和gamma三个属性,它们分别对应手机摆放的三维倾角变化。要理解它们,就要理解手机的方向模型。当手机水平摆放时,使用三个轴标示它的空间位置:x轴代表横轴、y轴代表竖轴、z轴代表垂直轴。event对象的三个属性就对应这三根轴的旋转角度。

  • alpha:表示围绕z轴的旋转,0~360(度)。当设备水平摆放时,顶部指向地球的北极,alpha此时为0。
  • beta:表示围绕x轴的旋转,-180~180(度),由前向后。当设备水平摆放时,beta此时为0。
  • gramma:表示围绕y轴的选择,-90~90(度),从左到右。当设备水平摆放时,gramma此时为0。

7.2 移动(motion)

(1)检测是否支持

if(window.DeviceMotionEvent){
  //支持
}else{
  //不支持
}

(2)和方向事件一样,移动也有监听事件:devicemotion

window.addEventListener("devicemotion",listener,true)

function listener(event){
  var acceleration = event.acceleration;
  var accelerationIncludingGravity = event.accelerationIncludingGravity;
  var rotationRate = event.rotationRate;
  var interval = event.interval;
}

上面代码中,event事件对象有acceleration、accelerationIncludingGravity、rotationRate和interval四个属性。

属性说明:
(1)acceleration、accelerationIncludingGravity

acceleration和accelerationIncludingGravity属性都包含三个轴:
x轴:西向东(acceleration.x)
y轴:南向北(acceleration.y)
z轴:垂直地面(acceleration.z)

(2)rotationRate

rotationRate有三个值:
alpha: 设备沿着垂直屏幕的轴的旋转速率 (桌面设备相对于键盘)
beta: 设备沿着屏幕左至右方向的轴的旋转速率(桌面设备相对于键盘)
gamma: 设备沿着屏幕下至上方向的轴的旋转速率(桌面设备相对于键盘)

(3)interval

interval 表示的是从设备获取数据的频率,单位是毫秒。

更多:检测设备方向

简单的摇一摇功能:

var SHAKE_THRESHOLD = 3000;   
var last_update = 0;   
var x = y = z = last_x = last_y = last_z = 0;

if (window.DeviceMotionEvent) {   
  window.addEventListener("devicemotion", deviceMotionHandler, false);   
}
 
function deviceMotionHandler(eventData) {   
  var acceleration = eventData.accelerationIncludingGravity;   
  var curTime = new Date().getTime();   
  var diffTime = curTime - last_update;   
  if (diffTime > 100) {   
    last_update = curTime;   
    x = acceleration.x;   
    y = acceleration.y;   
    z = acceleration.z;   
    var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;   
   if (speed > SHAKE_THRESHOLD) {
     //dosomething
   };    
   last_x = x;   
   last_y = y;   
   last_z = z;   
 }   
}