1. 程式人生 > >h5學習之呼叫手機底層硬體----加速度感測器和震動

h5學習之呼叫手機底層硬體----加速度感測器和震動

最近在開發微信公眾平臺時,有一個需求是通過搖一搖進行互動活動,剛開始以為要用微信內的搖一搖功能,但是微信根本沒有提供介面(搖一搖是呼叫手機硬體,根本不能呼叫),所以只能換一種思路,微信可以跟我們的伺服器端對接,所以只能通過一些前端的指令碼語言去解決。幸運的是:H5 + 提供了對手機硬體資源訪問的封裝API,這樣的話,實現搖一搖和震動就有了途徑,不止這些,通過這些API的呼叫對系統其他功能也可以訪問 ,今天就介紹兩個功能。

一、加速器的呼叫  

通過widow物件中DeviceMotionEvent 來判斷 瀏覽器(手機)是否支援訪問硬體資源,window.addEventListener('devicemotion', deviceMotionHandler, false);通過上一句程式碼來對該事件進行監聽,第一個引數是事件型別,第二個引數是一個Handler 進行對事件的處理,通過var acceleration = eventData.accelerationIncludingGravity; 獲得加速器物件,x = acceleration.x;y = acceleration.y;z = acceleration.z; 分別獲取感測器三個分量的引數,這樣就完成了對搖一搖引數的獲取。

二、 手機震動的實現

    振動事件 同樣是封裝在widow.navigation物件中,通過 var vibrateSupport  = 'vibrate' in navigation  來檢測瀏覽器是否支援呼叫手機振動事件。如果支援 為了相容不通的瀏覽器 需要進行對vibrate 進行做不同的選擇。navigator.vibrate = navigator || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate; 然後在需要的地方 呼叫navigator.vibrate(3000), 就可以實現手機震動的了(該處震動三秒),同時期支援陣列 如 navigator.vibrate.([300,200,300,200,300]),300是表示震動的毫秒數,200表示兩次震動的時間間隔。

     同樣對其他操作,通過對API的呼叫,實現也都十分簡單,這樣以來,我們完全可以通過H5來實現不通的功能,來實現跨平臺了,關鍵程式碼如下

if (window.DeviceMotionEvent) {
		window.addEventListener('devicemotion', deviceMotionHandler, false);
	}
	var vibrateSupport = "vibrate" in navigator
	if (vibrateSupport) { //相容不同的瀏覽器
		navigator.vibrate = navigator.vibrate || navigator.webkitVibrate || navigator.mozVibrate || navigator.msVibrate;
	}

function deviceMotionHandler(eventData) {
	var acceleration = eventData.accelerationIncludingGravity;
	var currTime = new Date().getTime();
	var diffTime = currTime - last_update;
	console.info(diffTime);
	if (diffTime > 100) {
		last_update = currTime;
		x = acceleration.x;
		y = acceleration.y;
		z = acceleration.z;
		var speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 30000;
		console.info(speed);
		if (speed > SHAKE_THRESHOLD) {
			//要一搖之後進行業務邏輯處理
			doResult();
		}
		
		
		last_x = x;
		last_y = y;
		last_z = z;

	}