Xamarin.Essentials:OrientationSensor
OrientationSensor クラスでは、3 次元空間内のデバイスの向きを監視できます。
Note
これは、3D 空間内のデバイスの向きを決定するためのクラスです。 デバイスのビデオ ディスプレイが縦向きモードか横向きモードかを判断する必要がある場合は、DeviceDisplay
クラスから利用できる ScreenMetrics
オブジェクトの Orientation
プロパティを使用します。
作業開始
この API の使用を始めるには、Xamarin.Essentials の概要ガイドを読み、ライブラリが正しくインストールされてプロジェクトに設定されていることを確認してください。
OrientationSensor の使用
クラスの Xamarin.Essentials への参照を追加します。
using Xamarin.Essentials;
Start
メソッドを呼び出して OrientationSensor
を有効にし、デバイスの向きの変更を監視します。無効にする場合は Stop
メソッドを呼び出します。 すべての変更は ReadingChanged
イベントを通じて戻されます。 使用例を次に示します。
public class OrientationSensorTest
{
// Set speed delay for monitoring changes.
SensorSpeed speed = SensorSpeed.UI;
public OrientationSensorTest()
{
// Register for reading changes, be sure to unsubscribe when finished
OrientationSensor.ReadingChanged += OrientationSensor_ReadingChanged;
}
void OrientationSensor_ReadingChanged(object sender, OrientationSensorChangedEventArgs e)
{
var data = e.Reading;
Console.WriteLine($"Reading: X: {data.Orientation.X}, Y: {data.Orientation.Y}, Z: {data.Orientation.Z}, W: {data.Orientation.W}");
// Process Orientation quaternion (X, Y, Z, and W)
}
public void ToggleOrientationSensor()
{
try
{
if (OrientationSensor.IsMonitoring)
OrientationSensor.Stop();
else
OrientationSensor.Start(speed);
}
catch (FeatureNotSupportedException fnsEx)
{
// Feature not supported on device
}
catch (Exception ex)
{
// Other error has occurred.
}
}
}
OrientationSensor
の読み取り値が Quaternion
の形式で返されます。これは、2 つの 3D 座標系に基づくデバイスの向きを表現しています。
デバイス (通常は電話またはタブレット) には、次の軸を持つ 3D 座標系があります。
- 正の X 軸は、縦向きモードの画面の右方向を指します。
- 正の Y 軸は、縦向きモードの画面の上方向を指します。
- 正の Z 軸は、画面から外れます。
地球の 3D 座標系には、次の軸があります。
- 正の X 軸は地球の表面に対する接線であり、東を指します。
- 正の Y 軸もまた地球の表面に対する接線であり、北を指します。
- 正の Z 軸は地球の表面に対する垂直線であり、上方を指します。
Quaternion
では、地球の座標系に対するデバイスの座標系の回転が表現されます。
Quaternion
の値は、軸の周りの回転と密接に関係しています。 回転軸が正規化されたベクター (ax, ay, az) であり、回転角度が Θ であった場合、四元数の (X, Y, Z, W) 成分は次のようになります。
(ax·sin(Θ/2), ay·sin(Θ/2), az·sin(Θ/2), cos(Θ/2))
これらは右手座標系です。したがって、右手の親指で回転軸の正の方向を指すと、その他の指の曲がる方向が正の角度の回転方向を示します。
次に例を示します。
デバイスが画面を上に向けてテーブルの上に平らに置かれ、デバイスの上部 (縦向きモード) が北を指している場合、2 つの座標系は揃っています。
Quaternion
の値は単位四元数 (0, 0, 0, 1) を示します。 すべての回転は、この位置を基準として分析できます。デバイスが画面を上に向けてテーブルの上に平らに置かれ、デバイスの上部 (縦向きモード) が西を指している場合、
Quaternion
の値は (0, 0, 0.707, 0.707) になります。 デバイスは、地球の Z 軸の周りを 90 度回転しています。デバイスの上部 (縦向きモード) が空を指すようにデバイスが垂直に固定され、デバイスの背面が北を向いている場合、デバイスは X 軸の周りを 90 度回転しています。
Quaternion
の値は (0.707, 0, 0, 0.707) です。デバイスの左端がテーブルに付くようにデバイスが置かれ、上部が北を指している場合、デバイスは Y 軸の周りを -90 度 (または、負の Y 軸の周りを 90 度) 回転しています。
Quaternion
の値は (0, -0.707, 0, 0.707) です。
センサーの速度
- Fastest – センサー データを最高速度で取得します (UI スレッドに返ることが保証されません)。
- Game – ゲームに適した速度です (UI スレッドに返ることが保証されません)。
- Default – 画面の向きの変更に適した既定の速度です。
- UI – 一般的なユーザー インターフェイスに適した速度です。
イベント ハンドラーが UI スレッドでの実行を保証されておらず、そのイベント ハンドラーでユーザー インターフェイス要素にアクセスする必要がある場合は、MainThread.BeginInvokeOnMainThread
メソッドを使用してそのコードを UI スレッドで実行します。