スレート型のWindows 8端末やWindows Phone 8端末にはさまざまなセンサーがついています。ここでは、センサーを扱ってみます。
一式のコードはこちらにあります。
Windows 8のセンサー
センサーを扱うためのクラスはWindows.Devices.Sensors名前空間に定義されており、次のセンサーが利用できます。
- LightSensor:光センサー(明るさを取得する)
- Accelerometer:加速度センサー(デバイスの向きを取得する)
- Gyrometer:ジャイロセンサー
- Inclinometer:傾斜センサー(デバイスの傾きを取得する)
- OrientationSensor:デバイスの向きを回転行列と四元数で取得する
- SimpleOrientationSensor:デバイスの向きを取得する
- Compass:方角を取得する
Windows Phone 8のセンサー
Windows Phone 8ではWindows 8で利用可能ないくつかのセンサーは内容です。
- Accelerometer:加速度センサー(デバイスの向きを取得する)
- Gyrometer:ジャイロセンサー
- Inclinometer:傾斜センサー(デバイスの傾きを取得する)
- OrientationSensor:デバイスの向きを回転行列と四元数で取得する
- Compass:方角を取得する
センサーを利用する
実際にセンサーを利用してみます。センサーはほぼ同じ使い方になっており、次の2つです。
// ジャイロメーターgyrometer = Gyrometer.GetDefault();
if ( gyrometer != null ) {
gyrometer.ReadingChanged += MainPage_ReadingChanged;
}
else {
TextGyrometer.Text = @"ジャイロメーターはありません";
}
Windows Phone 8では、センサーがない場合は例外が発生します。手持ちのLumia 630はジャイロセンサーがないので、例外が発生しました。
// ジャイロメーターtry {
gyrometer = Gyrometer.GetDefault();
if ( gyrometer != null ) {
gyrometer.ReadingChanged += MainPage_ReadingChanged;
}
}
catch ( Exception ) {
TextGyrometer.Text = @"ジャイロメーターはありません";
}
続いて値が変更されたときに呼ばれるハンドラです。args.Reading にセンサーの値が入っているので、それを使います。Windows Phone 8では スレッドの切り替えが Dispatcher.BeginInvoke( new Action( ... ) ); になります。
async void MainPage_ReadingChanged( Gyrometer sender, GyrometerReadingChangedEventArgs args ){
await Dispatcher.RunAsync( CoreDispatcherPriority.Normal, () =>
{
TextGyrometer.Text = string.Format( @"Gyrometer : X={0} Y={1} Z={2}",
args.Reading.AngularVelocityX.ToString(),
args.Reading.AngularVelocityY.ToString(),
args.Reading.AngularVelocityZ.ToString() );
} );
}