分享由HTML5寫的手機搖一搖功能

HTML5一個重要特性就是DeviceOrientation,它將底層的方向傳感器和運動傳感器進行了高級封裝,提供了DOM事件的支持。這個特性包括兩種事件:

一、 deviceOrientation:封裝了方向傳感器數據的事件,能夠獲取手機靜止狀態下的方向數據,例如手機所處角度、方位、朝向等。

二、 deviceMotion:封裝了運動傳感器數據的事件,能夠獲取手機運動狀態下的運動加速度等數據。
使用它咱們可以很容易的實現重力感應、指南針等有趣的功能,在手機上將很是有用。例如Opera H5體驗版裏的重力感應球示例就是經過監聽DeviceOrientation
API的deviceOrientation事件來實現的。 spa

其實它還能幫助咱們在網頁上實現一個手機應用裏很是常見而時尚的功能:手機搖一搖。

DeviceMotionEvent(設備運動事件)返回設備有關於加速度和旋轉的相關信息。加速度的數據將包含三個軸:x,y和z(示意以下圖所示,x軸橫向貫穿手機屏幕或者筆記本鍵盤,y軸縱向貫穿手機屏幕或筆記本鍵盤,z軸垂直於手機屏幕或筆記本鍵盤)。由於有些設備可能沒有硬件來排除重力的影響,該事件會返回兩個屬性,accelerationIncludingGravity(含重力的加速度)和acceleration(加速度),後者排除了重力的影響。 .net

1. [代碼]監聽運動傳感事件    

1 if (window.DeviceMotionEvent) {
2  window.addEventListener(‘devicemotion’,deviceMotionHandler, false);
3 }

2. [代碼]獲取含重力的加速度     

1 function deviceMotionHandler(eventData) {
2  var acceleration =eventData.accelerationIncludingGravity;
3 }

3. [代碼]核心方法實現代碼     

01 var SHAKE_THRESHOLD = xxx;
02 var last_update = 0;
03 var x, y, z, last_x, last_y, last_z;
04  
05 function deviceMotionHandler(eventData) {
06  var acceleration =eventData.accelerationIncludingGravity;
07  
08  var curTime = newDate().getTime();
09  
10  if ((curTime – lastUpdate)> 100) {
11  
12  var diffTime = curTime -last_update;
13  last_update = curTime;
14  
15  x = acceleration.x;
16  y = acceleration.y;
17  z = acceleration.z;
18  
19  var speed = Math.abs(x +y + z – last_x – last_y – last_z) / diffTime * 10000;
20  
21  if (speed > SHAKE_THRESHOLD) {
22  alert(「shaked!」);
23  }
24  last_x = x;
25  last_y = y;
26  last_z = z;
27  }
28 }
相關文章
相關標籤/搜索