SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

速習 Windowsストアアプリケーション

センサーに対応したWindowsストアアプリを作成する(前編)

速習 Windowsストアアプリケーション 第12回


センサーを利用する

加速度センサー

 加速度センサー(Accelerometer)を利用することで端末にかかる加速度を測定することができます。

加速度センサーの値の取得

 加速度センサーの値は以下のようにReadingChangedイベントで取得します。

加速度センサーの値を取得する
this._accelerometer = Accelerometer.GetDefault();

if (this._accelerometer != null)
{
    // 加速度に変更があった場合のイベントハンドラー
    _accelerometer.ReadingChanged += _accelerometer_ReadingChanged;
}

 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つでもアプリケーションの幅を広げることができますが、組み合わせるといろいろな動きを取得できます。センサーを利用して面白いアプリケーションが生み出せるように、これらのセンサーの基本を理解しておくと良いでしょう。

 次回は残りセンサーの解説と、実際にセンサーを利用したアプリケーションのコードを紹介しようと思います。

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
速習 Windowsストアアプリケーション連載記事一覧

もっと読む

この記事の著者

西村 誠(ニシムラ マコト)

 Microsoft MVP Windows Platform Development。 Flash、PHPの開発経験もあり国産ECサイト構築フレームワーク「EC-CUBE」の公式エバンジェリストでもある。 ブログ:眠るシーラカンスと水底のプログラマー 著書:基礎から学ぶ Windowsストアアプリ開発

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/7835 2014/07/29 20:06

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー