Adobe Edge Animate --使用HTML5實現手機搖一搖功能
版權聲明:
本文版權屬於 北京聯友天下科技發展有限公司。
轉載的時候請注明版權和原文地址。
HTML5的發展日新月異,其功能也越來越豐富和完善,比如12年HTML5可支持手機搖一搖功能,本文末尾將附上有關技術問題。現在我們將講解如何在Edge中使用HTML5實現搖一搖功能。
首先,需要注意的是,並不是所有手機都支持HTML5的搖一搖功能,以下為目前適用范圍:
1、 iOS系統(包括ipad,iphone),自帶safari瀏覽器和chorme瀏覽器皆可識別
2、 Android系統,不識別,需要安裝特定瀏覽器如oprea,chrome等對html5支持較好的瀏覽器。
成果圖:
搖一搖播放動畫
一、制作搖一搖畫面
這個純屬個人喜好,各人可根據自身愛好設計相應的搖一搖畫面,不過要注意帶有提醒用戶這是一個需要“shake”的畫面即可。
制作完成后,在時間軸上找一個時間點(如0秒處),設定一個標簽(如“start”)以便調用動畫播放點。
二、制作搖一搖之后播放的動畫
同樣,可自主發揮,但是需要體現搖一搖已經起作用了。制作完動畫或者相應的提示畫面之后,在時間軸上另外一個時間點(如1秒處),設定一個標簽(如“shake”)以便搖一搖之后調用這個動畫播放。
三、添加搖一搖功能
在第一個標簽(“start”)出,添加一個觸發事件(trigger),添加支持手機搖一搖的javascript功能函數,添加事件監控函數,用於監控設備的運動狀態,當設備有“晃動”時,調用自定義的函數。
在此需要注意的是,需要對設備的晃動狀態做出一定的限制(或者說判定),由於正常使用過程中也會有晃動的狀態出現,只有當晃動幅度等達到一定程度時,才判定為“搖一搖”,這時就調用sym.play(“shake”);播放搖一搖動畫。以下為添加的搖一搖功能函數。
var SHAKE_THRESHOLD = 5000;
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) {
sym.play("shake");
}
last_x = x;
last_y = y;
last_z = z;
}
}
if (window.DeviceMotionEvent) {
window.addEventListener('devicemotion',deviceMotionHandler,false);
} else {
//document.getElementById("dmEvent").innerHTML = "Not supported on your device."
}
在末尾,添加sym.stop();函數,讓動畫停止播放。
到此,一個簡易的搖一搖功能頁面就實現了。
四、測試
測試可以用兩種方法,第一種是通過服務器訪問模式,第二種是通過編譯成為app或apk方式安裝到移動端。
1、 服務器訪問
在個人電腦端,啟用iis服務器,將edge發布出來的文件放置在服務器端目錄,用手機訪問即可;也可安裝apache服務器,其他做法與iis一致。注意服務器需要做出相應的配置工作,具體參照網絡上相關的介紹。
2、 編譯為應用程序
將工程文件通過在電腦中ios或者android相關編譯工具,編譯成為應用程序,安裝到移動端,即可直接打開體驗搖一搖功能。
本文地址:http://www.cnblogs.com/adobeedge/p/Adobe_Edge_Shake.html
附:HTML5搖一搖的相關技術問題(文章來自網絡技術愛好者)
HTML5另外一個重要特性就是DeviceOrientation,它將底層的方向傳感器和運動傳感器進行了高級封裝,提供了DOM事件的支持。這個特性包括兩種事件:
1、 deviceOrientation:封裝了方向傳感器數據的事件,可以獲取手機靜止狀態下的方向數據,例如手機所處角度、方位、朝向等。
2、 deviceMotion:封裝了運動傳感器數據的事件,可以獲取手機運動狀態下的運動加速度等數據。
使用它我們能夠很容易的實現重力感應、指南針等有趣的功能,在手機上將非常有用。例如Opera H5體驗版里的重力感應球示例就是通過監聽DeviceOrientation API的deviceOrientation事件來實現的。
DeviceMotionEvent(設備運動事件)返回設備有關於加速度和旋轉的相關信息。加速度的數據將包含三個軸:x,y和z(示意如下圖所示,x軸橫向貫穿手機屏幕或者筆記本鍵盤,y軸縱向貫穿手機屏幕或筆記本鍵盤,z軸垂直於手機屏幕或筆記本鍵盤)。因為有些設備可能沒有硬件來排除重力的影響,該事件會返回兩個屬性,accelerationIncludingGravity(含重力的加速度)和acceleration(加速度),后者排除了重力的影響。
監聽運動傳感事件:
if (window.DeviceMotionEvent) {
window.addEventListener(‘devicemotion’,deviceMotionHandler, false);
}
獲取含重力的加速度:
function deviceMotionHandler(eventData) {
var acceleration =eventData.accelerationIncludingGravity;
}
下面就涉及到我們如何計算用戶搖晃手機的原理了。考慮的要點如下:
1、 用戶大多時候都是以一個方向為主晃動手機來進行搖動;
2、 在晃動時三個方向的加速度數據必定都會變化;
3、 我們不能誤判手機正常的運動行為,想一想,如果你的手機放在褲兜里,走路時它也會有加速度數據變化。
綜上,我們應該針對三個方向的加速度進行計算,間隔測量它們,考察它們在固定時間段里的變化率,而且需要為它確定一個閾值來觸發動作。
我們需要定義幾個變量來記錄歷史x、y、z軸的數據以及上一次觸發的時間。核心方法實現代碼如下:
var SHAKE_THRESHOLD = xxx;
var last_update = 0;
var x, y, z, last_x, last_y, last_z;
function deviceMotionHandler(eventData) {
var acceleration =eventData.accelerationIncludingGravity;
var curTime = newDate().getTime();
if ((curTime – lastUpdate)> 100) {
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) {
alert(“shaked!”);
}
last_x = x;
last_y = y;
last_z = z;
}
}