加速度センサー入力

Flash Player 10.1 以降、Adobe AIR 2 以降

Accelerometer クラスは、デバイスのモーションセンサーによって検出されたアクティビティに基づいてイベントを送出します。このデータは、デバイスの位置または 3D 軸に沿った移動を表します。デバイスが移動すると、センサーによってその移動が検出され、デバイスの加速度座標が返されます。Accelerometer クラスは、加速度センサーがサポートされているかどうかを照会するメソッドを提供します。また、加速度センサーイベントが送出される頻度を設定するメソッドも提供します。

加速度センサーの軸は、デバイスの物理的な方向ではなく、表示の方向に沿って正規化されます。デバイスで表示の方向が再設定されると、加速度センサーの軸の方向も同様に再設定されます。このため、ユーザーが通常の直立状態の表示位置で電話を保持しているときは、電話がどの方向に回転しても、Y 軸はほぼ垂直になります。例えば、自動回転が無効で、ブラウザーの SWF コンテンツがフルスクリーンモードの場合は、デバイスの回転時にも加速度センサーの軸の方向は再設定されません。

加速度センサーのサポートの確認

ランタイム環境でこの機能を使用できるかどうかを確認するには、 Accelerometer.isSupported プロパティを使用します。

if (Accelerometer.isSupported) 
{ 
    // Set up Accelerometer event listeners and code. 
}

Accelerometer クラスおよびそのメンバーは、各 API エントリにリスト表示されているランタイムバージョンにアクセスできます。ただし、この機能を使用できるかどうかは、実行時の現在の環境によって決まります。例えば、Flash Player 10.1 では、Accelerometer クラスのプロパティを使用してコードをコンパイルできますが、 Accelerometer.isSupported プロパティを使用して、ユーザーのデバイス上で加速度センサー機能が使用できるかどうかを確認する必要があります。 Accelerometer.isSupported がランタイムで true の場合、Accelerometer は現在サポートされています。

加速度センサーの変更の検出

加速度センサーを使用するには、Accelerometer オブジェクトをインスタンス化し、送出する update イベントに登録する必要があります。 update イベントは、加速度センサーイベントオブジェクトです。このイベントには 4 つのプロパティがあり、それぞれ数値を表します。

  • accelerationX - X 軸方向の加速度。単位は G。デバイスが直立状態にある場合、X 軸はデバイスの左から右へ伸びます(デバイスの上部が上を向いている場合がデバイスの直立状態です)。デバイスが右方向に移動する場合、加速度は正の値になります。

  • accelerationY - Y 軸方向の加速度。単位は G。デバイスが直立状態にある場合は、Y 軸はデバイスの下から上へ伸びます(デバイスの上部が上を向いている場合がデバイスの直立状態です)。デバイスがこの軸を基準にして上方向に移動する場合、加速度は正の値になります。

  • accelerationZ - Z 軸方向の加速度。単位は G。Z 軸はデバイス面の垂直方向に伸びます。デバイスの画面が上を向くように移動する場合、加速度は正の値になります。デバイスの画面が地面に向いている場合、加速度は負の値になります。

  • timestamp —ランタイムが初期化されてからイベント発生時までの時間(ミリ秒)です。

1 G は引力に起因する標準加速度で、約 9.8 m/sec 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() メソッドを呼び出すことにより、加速度センサーイベントの間隔を必要に応じて調整できます。このメソッドは 1 つのパラメーター 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)); 
}

ただし、この移動平均は、加速度センサーの更新間隔が短い場合にのみ有効です。