移動端搖一搖與重力感應事件html
經過html5重要特性DeviceOrientation與devicemotion實現移動端搖一搖與重力感應事件。html5
一.DeviceMotion瀏覽器
DeviceMotion:deviceMotion封裝了運動傳感器數據的事件,能夠獲取手機運動狀態下的運動加速度等數據。函數
DeviceMotionEvent:this
1.event.accelaration:x(y,z):設備在x(y,z)方向上的移動加速度值。
2.event.accelarationIncludingGravity:x(y,z):考慮了重力加速度後設備在x(y,z)方向上的移動加速度值。
3.event.rotationRate:alpha,beta,gamma:設備繞x,y,z軸旋轉的角度。spa
event.accelarationIncludingGravity與event.accelaration的區別在於前者加入了重力加速度,即在z軸方向加了9.8,在x,y方向上的值二者相同。code
示例:(當手機搖晃頁面時,會彈出shaked的提示,而且在頁面上顯示搖晃時的x,y,z方向的加速度值。)htm
屬性 | 值 |
---|---|
SHAKE_THRESHOLD | 閾值。閾值越大,觸發搖晃事件時手機搖晃的程度越劇烈 |
x | x方向的加速值 |
y | y方向的加速值 |
z | z方向的加速值 |
deviceMotionHandler | 搖晃事件處理程序 |
方法 | 做用 |
---|---|
init | 初始化Shake對象 |
參數 | 值 |
---|---|
threshold | 自定義閾值,默認2000 |
callback | 搖晃後的回調函數 |
function Shake(threshold, callback) { this.SHAKE_THRESHOLD = threshold ? threshold : 2000; //定義閾值 this.last_update = 0; this.x = this.y = this.z = this.last_x = this.last_y = this.last_z = 0; this.init = function() { if (window.DeviceMotionEvent) { window.addEventListener('devicemotion', this.deviceMotionHandler, false); } else { alert('您的瀏覽器不支持DeviceMotion'); } }; var that = this; this.deviceMotionHandler = function(eventData) { var acceleration = eventData.accelerationIncludingGravity; var curTime = new Date().getTime(); if ((curTime - that.last_update) > 100) { var diffTime = curTime - that.last_update; that.last_update = curTime; that.x = acceleration.x; that.y = acceleration.y; that.z = acceleration.z; var speed = Math.abs(that.x + that.y + that.z - that.last_x - that.last_y - that.last_z) / diffTime * 10000; if (speed > 2000) { document.getElementById("speed").innerHTML = speed; } //document.getElementById("speed").innerHTML = curTime +" -"+ that.last_update + "=" + diffTime; if (speed > that.SHAKE_THRESHOLD) { if (window.console && console.log) { console.log("shaked"); } if (callback != undefined) { callback(that); } } that.last_x = that.x; that.last_y = that.y; that.last_z = that.z; } } };
window.onload = function() { var shake1 = new Shake(2000, function(obj) { //alert("shaked"); var r = document.getElementById("result"); r.innerHTML = "x:" + parseInt(obj.x) + ""; r.innerHTML += "y:" + parseInt(obj.y) + ""; r.innerHTML += "z:" + parseInt(obj.z) + ""; }); shake1.init(); };
三.DeviceOrientationEvent對象
工做原理:根據event對象的三個方向的參數來肯定設備的旋轉角度。其中,alpha的取值範圍是0-360,這個須要根據設blog
備的指南針設定狀況而定,通常來講,設備指向正北方向時爲0.beta值爲設備繞x軸旋轉的角度,取值範圍爲-180-180。
gamma取值範圍-90-90.
屬性 值
1.alpha 設備指示的方向,根據指南針的設定狀況而定 (指南針的應用只要拿到alpha就OK啦)
2.beta 設備繞x軸旋轉的角度
3.gamma 設備繞y軸旋轉的角度
示例:
if (window.DeviceOrientationEvent) { window.addEventListener('deviceorientation', DeviceOrientationHandler, false); } else { alert("您的瀏覽器不支持DeviceOrientation"); } function DeviceOrientationHandler(event) { var alpha = event.alpha, beta = event.beta, gamma = event.gamma, stage = document.getElementById("result"), dataContainerOrientation = document.getElementById("result2"), yy = document.getElementById("result3"); if (alpha != null || beta != null || gamma != null) { dataContainerOrientation.innerHTML = "alpha:" + parseInt(alpha) + "<br />beta:" + parseInt(beta) + "<br />gamma:" + parseInt(gamma); //判斷屏幕方向 var html = ""; var gamma_html = ""; if (gamma > 0) { gamma_html = "向右傾斜"; } else { gamma_html = "向左傾斜"; } //html += "<br />" + gamma_html yy.innerHTML = gamma_html; } else { dataContainerOrientation.innerHTML = "當前瀏覽器不支持DeviceOrientation"; } }
這裏面alpha值的意義並不大,主要參考beta和gamma值。
當屏幕從水平沿y軸向左傾斜時gamma值變爲負值,向右傾斜變爲正值。
檔屏幕從水平沿x軸向前傾斜時beta值變爲正值,向後傾斜時變爲負值。
因此,若是咱們設定一個閾值,當beta和gamma的絕對值大於這個閾值時,咱們就認爲設備發生了旋轉。另外根據beta和 gamma的值來判斷向左傾斜仍是向右傾斜,以及傾斜的程度。
三.二者區別
1.DeviceOrientationEvent的值是相對於初始狀態的差值,只要設備方向不變,怎麼動都不會影響數值; 2.DeviceMotionEvent是相對於以前的某個瞬間值的差值時間比,即變化的速度,一旦設備靜止則會恢復爲0。