加速計輸入

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)); 
}

不過,只有在加速計更新很小時,才適合使用這個移動平均值。