移動端搖一搖與重力感應事件

移動端搖一搖與重力感應事件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。

相關文章
相關標籤/搜索