HTML5一個重要特性就是DeviceOrientation,它將底層的方向傳感器和運動傳感器進行了高級封裝,提供了DOM事件的支持。這個特性包括兩種事件:
1、 deviceOrientation:封裝了方向傳感器數據的事件,可以獲取手機靜止狀態下的方向數據,例如手機所處角度、方位、朝向等。
2、 deviceMotion:封裝了運動傳感器數據的事件,可以獲取手機運動狀態下的運動加速度等數據。 使用它我們能夠很容易的實現重力感應、指南針等有趣的功能,在手機上將非常有用。例如Opera H5體驗版裏的重力感應球示例就是通過監聽DeviceOrientation API的deviceOrientation事件來實現的。 其實它還能幫助我們在網頁上實現一個手機應用裏非常常見而時尚的功能:手機搖一搖。
DeviceMotionEvent(設備運動事件)返回設備有關於加速度和旋轉的相關信息。加速度的數據將包含三個軸:x,y和z(示意如下圖所示,x軸橫向貫穿手機屏幕或者筆記本鍵盤,y軸縱向貫穿手機屏幕或筆記本鍵盤,z軸垂直於手機屏幕或筆記本鍵盤)。因爲有些設備可能沒有硬件來排除重力的影響,該事件會返回兩個屬性,accelerationIncludingGravity(含重力的加速度)和acceleration(加速度),後者排除了重力的影響。
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<div>搖晃手機,手機震動</div>
</body>
<script type="text/javascript">
//運動事件監聽
if (window.DeviceMotionEvent) {
window.addEventListener('devicemotion',deviceMotionHandler,false);
}
//獲取加速度信息
//通過監聽上一步獲取到的x, y, z 值在一定時間範圍內的變化率,進行設備是否有進行晃動的判斷。
//而爲了防止正常移動的誤判,需要給該變化率設置一個合適的臨界值。
var SHAKE_THRESHOLD = 4000;
var last_update = 0;
var x, y, z, last_x = 0, last_y = 0, last_z = 0;
function deviceMotionHandler(eventData) {
var acceleration =eventData.accelerationIncludingGravity;
var curTime = new Date().getTime();
if ((curTime-last_update)> 10) {
var diffTime = curTime -last_update;
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) {
vibration(); // Do something
}
last_x = x;
last_y = y;
last_z = z;
}
}
function vibration(){
navigator.vibrate = navigator.vibrate
|| navigator.webkitVibrate
|| navigator.mozVibrate
|| navigator.msVibrate;
if (navigator.vibrate) {
// 支持
console.log("支持設備震動!");
}
//中括號裏面的值標示[震動時間,停止時間,震動時間,停止時間………..]。沒有錯就是這種規律,簡單明瞭
navigator.vibrate([500, 300, 400,300]);
}
</script>
</html>