センサーを利用する
加速度センサー
加速度センサー(Accelerometer)を利用することで端末にかかる加速度を測定することができます。
加速度センサーの値の取得
加速度センサーの値は以下のようにReadingChangedイベントで取得します。
this._accelerometer = Accelerometer.GetDefault();
if (this._accelerometer != null)
{
// 加速度に変更があった場合のイベントハンドラー
_accelerometer.ReadingChanged += _accelerometer_ReadingChanged;
}
ReadingChangedで取得した値は以下のように取り出します。
private async void _accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
AccelerometerReading reading = args.Reading;
AccelerationX.Text = String.Format("AccelerationX: {0}", args.Reading.AccelerationX > 0 ? "右へ加速" : "左へ加速");
AccelerationY.Text = String.Format("AccelerationY: {0}", args.Reading.AccelerationY > 0 ? "下へ加速" : "上へ加速");
AccelerationZ.Text = String.Format("AccelerationZ: {0}", args.Reading.AccelerationZ > 0 ? "奥へ加速" : "手前へ加速");
});
}
ReadingChangedに設定したイベントハンドラーの引数(args)から以下のようにXYZ方向の加速度の値を取得できます。
Shakenイベントハンドラーで端末のシェイク動作を取得
またAccelerometerを用いて端末がシェイクされたことを取得できます。
this._accelerometer = Accelerometer.GetDefault();
if (this._accelerometer != null)
{
// 加速度に変更があった場合のイベントハンドラー
_accelerometer.ReadingChanged += _accelerometer_ReadingChanged;
// 端末がシェイクされた場合のイベントハンドラー
_accelerometer.Shaken += _accelerometer_Shaken;
}
}
void _accelerometer_Shaken(Accelerometer sender, AccelerometerShakenEventArgs args)
{
Debug.WriteLine("端末がシェイクされました。");
}
本記事で紹介したコードは添付のAccelerometerSampleというサンプルに記載されているので、ぜひ試してみてください。
角速度センサー
角速度センサー(Gyrometer)は端末にかかる回転を取得します。加速度センサーが端末のXYZ軸にかかる移動を取得できたのに対して、角速度センサーはXYZ軸に対しての回転を取得します。
角速度センサーの値は以下のように取得します。加速度センサーの場合と非常に似たコードになることを確認しながら読んでみてください。
角速度センサーの値の取得
角速度センサーの値もReadingChangedイベントで取得します。
this._gyrometer = Gyrometer.GetDefault();
if (this._gyrometer != null)
{
this._gyrometer.ReadingChanged += _gyrometer_ReadingChanged;
}
イベントハンドラーでは以下のように値を取り出します。
public async void _gyrometer_ReadingChanged(Gyrometer sender, GyrometerReadingChangedEventArgs args)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
GyrometerReading reading = args.Reading;
GyrometerX.Text = String.Format("GyrometerX: {0}", args.Reading.AngularVelocityX);
GyrometerY.Text = String.Format("GyrometerY: {0}", args.Reading.AngularVelocityY);
GyrometerZ.Text = String.Format("GyrometerZ: {0}", args.Reading.AngularVelocityZ);
});
}
args.Readingプロパティから取り出す値が加速度センサーとは異なっていますが、ほど同様のコートで記述できます。
角速度センサーのサンプルはGyrometerSampleです。
コンパス
コンパスは端末の向いている方角を取得できます。方位の北を標準としてどのくらい傾いているかという値で方位を測定します。
コンパスの値は以下のように取得します。
コンパスの値の取得
private Compass _compass;
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
this._compass = Compass.GetDefault();
if (this._compass != null)
{
this._compass.ReadingChanged += _compass_ReadingChanged;
CompassReading reading = this._compass.GetCurrentReading();
await setReading(reading);
}
}
private async void _compass_ReadingChanged(Compass sender, CompassReadingChangedEventArgs args)
{
CompassReading reading = args.Reading;
await setReading(reading);
}
private async Task setReading(CompassReading reading)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
this.compassHeadingAccuracy.Text = string.Format("コンパス精度: {0}", reading.HeadingAccuracy);
this.compassHeadingMagneticNorth.Text = string.Format("MagneticNorth: {0}", reading.HeadingMagneticNorth);
this.compassHeadingTrueNorth.Text = string.Format("TrueNorth: {0}", reading.HeadingAccuracy);
});
}
今回はこれまでのコードとは異なる部分がありますが、まずは共通している部分から解説します。
ReadingChangedイベントハンドラーで値を取得する部分は同じです。イベントハンドラーの中でsetReadingメソッドを呼び出しています。呼び出されたsetReadingメソッドの中で、コンパスの値を取り出して表示しています。
this.compassHeadingAccuracy.Text = string.Format("コンパス精度: {0}", reading.HeadingAccuracy);
this.compassHeadingMagneticNorth.Text = string.Format("MagneticNorth: {0}", reading.HeadingMagneticNorth);
this.compassHeadingTrueNorth.Text = string.Format("TrueNorth: {0}", reading.HeadingAccuracy);
HeadingAccuracyプロパティはコンパスの精度を表します。周りの磁気の影響を受けてコンパスが正常な値をとれていない場合の判定などに用います。
HeadingMagneticNorthプロパティは磁北を表し磁気上の北を指します。
HeadingAccuracyの値は地図上の真北を指します。値は北を0として、東、南、西とそれぞれ値が90ずつ増加していきます。
コンパスの値はハードウェア依存の部分があり、端末によってはHeadingMagneticNorthとHeadingAccuracyのどちらかしか取得できないケースもあるので、気をつけましょう。
ReadingChangedは変更がないと通知されない
ここまでのサンプルを試してみると気が付かれると思いますが、ReadingChangedイベントはアプリケーションの起動直後は発生しません。端末を動かしてみて初めてイベントハンドラーが呼び出されます。
アプリケーションを起動してすぐに値を取りたい場合は、今回のサンプルのようにGetCurrentReadingメソッドを呼び出す必要があります。3つ目のセンサーで初めてこのコードを紹介しましたが、これは最初の2つ、加速度センサーと角速度センサーでも同様です。
まとめ
今回はセンサーの中から3つ、加速度センサーと、角速度センサー、コンパスを紹介しました。これらのセンサーは1つでもアプリケーションの幅を広げることができますが、組み合わせるといろいろな動きを取得できます。センサーを利用して面白いアプリケーションが生み出せるように、これらのセンサーの基本を理解しておくと良いでしょう。
次回は残りセンサーの解説と、実際にセンサーを利用したアプリケーションのコードを紹介しようと思います。
