加速計輸入
Flash Player 10.1 以及更新的版本,Adobe AIR 2 以及更新的版本
Accelerometer 類別會根據裝置的移動感應器偵測到的活動傳送事件。這個資料代表裝置的位置或是沿著三維軸的移動。當裝置移動時,感應器會偵測此移動並回傳裝置的加速座標。Accelerometer 類別提供查詢是否支援加速計的方法,同時也設定加速事件傳送的速率。
加速計軸會標準化成顯示方向,而非裝置的實體方向。當裝置重新調整顯示的方向時,加速計軸也會重新調整方向。因此當使用者以正常直立的檢視位置握住電話時,Y 軸永遠大致垂直,不論將電話旋轉成哪個方向都一樣。例如,如果自動方向為關閉,當瀏覽器中的 SWF 內容為全螢幕模式時,則加速計軸在旋轉裝置時不會調整方向。
檢查加速計支援
使用 Accelerometer.isSupported 屬性測試執行階段環境是否可以使用這個功能:
if (Accelerometer.isSupported)
{
// Set up Accelerometer event listeners and code.
}
每個 API 項目列出的執行階段版本,都可以存取 Accelerometer 類別及其成員。不過,執行階段的目前環境會判斷這個功能的可用性。例如,在 Flash Player 10.1 中,您可以使用 Accelerometer 類型屬性來編譯程式碼,但是需要使用 Accelerometer.isSupported 屬性來測試 Accelerometer 功能在使用者裝置上的可用性。如果 Accelerometer.isSupported 在執行階段是 true,則表示 Accelerometer 支援目前存在。
偵測加速計變更
若要使用加速計感應器,請初始化 Accelerometer 物件,並註冊它所傳送的 update 事件。update 事件是 Accelerometer 事件物件。這個事件有四個屬性,而且每個屬性都是數字:
accelerationX:沿著 x 軸加速,單位為 G。當裝置處於直立狀態時,X 軸的方向是從裝置的左邊到右邊 (裝置的頂端面向上方時,裝置就是處於直立狀態)。如果裝置移向右方,則加速為為正值。
accelerationY:沿著 y 軸加速,單位為 G。當裝置處於直立狀態時,Y 軸的方向是從裝置的底部到上方 (裝置的頂端面向上方時,裝置就是處於直立狀態)。如果裝置向上移到這個軸的相對位置,加速會是正值。
accelerationZ:沿著 z 軸加速,單位為 G。Z 軸延伸方向與裝置表面垂直。如果您移動裝置,讓裝置的表面指向上方,加速會是正值。如果裝置的表面朝面地面,則加速會是負值。
timestamp:從執行階段初始化之後,事件時間的毫秒數。
1 g 是標準重力加速,大約 9.8 米/秒2。
以下是在文字欄位中顯示加速計資料的基本範例:
var accl:Accelerometer;
if (Accelerometer.isSupported)
{
accl = new Accelerometer();
accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler);
}
else
{
accTextField.text = "Accelerometer feature not supported";
}
function updateHandler(evt:AccelerometerEvent):void
{
accTextField.text = "acceleration X: " + evt.accelerationX.toString() + "\n"
+ "acceleration Y: " + evt.accelerationY.toString() + "\n"
+ "acceleration Z: " + evt.accelerationZ.toString()
}
若要使用這個範例,請確認建立 accTextField 文字欄位,並先將它新增至顯示清單,再使用這個程式碼。
您可以呼叫 Accelerometer 物件的 setRequestedUpdateInterval() 方法,調整加速計事件的預定時間間隔。這個方法接受一個參數 (interval),而這個參數是要求的更新間隔 (毫秒):
var accl:Accelerometer;
accl = new Accelerometer();
accl.setRequestedUpdateInterval(1000);
加速計更新之間的實際時間可能大於或小於這個值。在更新間隔中所做的任何變更會影響所有註冊的偵聽程式。 如果您未呼叫 setRequestedUpdateInterval() 方法,則應用程式會根據裝置的預設間隔來接收更新。
加速計資料會有某種程度的不準確度。您可以使用最近資料的移動平均值讓資料更平順。例如,下列範例納入最近加速計讀數與目前讀數,以取得四捨五入的結果。
var accl:Accelerometer;
var rollingX:Number = 0;
var rollingY:Number = 0;
var rollingZ:Number = 0;
const FACTOR:Number = 0.25;
if (Accelerometer.isSupported)
{
accl = new Accelerometer();
accl.setRequestedUpdateInterval(200);
accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler);
}
else
{
accTextField.text = "Accelerometer feature not supported";
}
function updateHandler(event:AccelerometerEvent):void
{
accelRollingAvg(event);
accTextField.text = rollingX + "\n" + rollingY + "\n" + rollingZ + "\n";
}
function accelRollingAvg(event:AccelerometerEvent):void
{
rollingX = (event.accelerationX * FACTOR) + (rollingX * (1 - FACTOR));
rollingY = (event.accelerationY * FACTOR) + (rollingY * (1 - FACTOR));
rollingZ = (event.accelerationZ * FACTOR) + (rollingZ * (1 - FACTOR));
}
不過,只有在加速計更新很小時,才適合使用這個移動平均值。