コンパスの使用Use the compass

重要な APIImportant APIs

サンプルSample

コンパスを使って現在の方位を検出する方法を説明します。Learn how to use the compass to determine the current heading.

磁北または真北を基準とした現在の方位をアプリで取得できます。An app can retrieve the current heading with respect to magnetic, or true, north. ナビゲーション アプリでは、コンパスを使ってデバイスが向いている方位を検出し、それに応じて地図の向きを設定します。Navigation apps use the compass to determine the direction a device is facing and then orient the map accordingly.

前提条件Prerequisites

Extensible Application Markup Language (XAML)、Microsoft Visual C#、イベントについて理解している必要があります。You should be familiar with Extensible Application Markup Language (XAML), Microsoft Visual C#, and events.

使うデバイスやエミュレーターがコンパスをサポートしている必要があります。The device or emulator that you're using must support a compass.

シンプルなコンパス アプリを作成するCreate a simple compass app

このセクションは、次の 2 つのサブセクションに分かれています。This section is divided into two subsections. 最初のサブセクションでは、シンプルなコンパス アプリケーションを最初から作成するために必要な手順を示します。The first subsection will take you through the steps necessary to create a simple compass application from scratch. 次のサブセクションでは、作成したアプリについて説明します。The following subsection explains the app you have just created.

InstructionsInstructions

  • [Visual C#] プロジェクト テンプレートから [空白のアプリ (ユニバーサル Windows] を選んで、新しいプロジェクトを作成します。Create a new project, choosing a Blank App (Universal Windows) from the Visual C# project templates.

  • プロジェクトの MainPage.xaml.cs ファイルを開き、記載されているコードを次のコードで置き換えます。Open your project's MainPage.xaml.cs file and replace the existing code with the following.

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using Windows.Foundation;
    using Windows.Foundation.Collections;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Controls.Primitives;
    using Windows.UI.Xaml.Data;
    using Windows.UI.Xaml.Input;
    using Windows.UI.Xaml.Media;
    using Windows.UI.Xaml.Navigation;

    using Windows.UI.Core; // Required to access the core dispatcher object
    using Windows.Devices.Sensors; // Required to access the sensor platform and the compass


    namespace App1
    {
        /// <summary>
        /// An empty page that can be used on its own or navigated to within a Frame.
        /// </summary>
        public sealed partial class MainPage : Page
        {
            private Compass _compass; // Our app' s compass object

            // This event handler writes the current compass reading to
            // the textblocks on the app' s main page.

            private async void ReadingChanged(object sender, CompassReadingChangedEventArgs e)
            {
               await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    CompassReading reading = e.Reading;
                    txtMagnetic.Text = String.Format("{0,5:0.00}", reading.HeadingMagneticNorth);
                    if (reading.HeadingTrueNorth.HasValue)
                        txtNorth.Text = String.Format("{0,5:0.00}", reading.HeadingTrueNorth);
                    else
                        txtNorth.Text = "No reading.";
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
               _compass = Compass.GetDefault(); // Get the default compass object

                // Assign an event handler for the compass reading-changed event
                if (_compass != null)
                {
                    // Establish the report interval for all scenarios
                    uint minReportInterval = _compass.MinimumReportInterval;
                    uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                    _compass.ReportInterval = reportInterval;
                    _compass.ReadingChanged += new TypedEventHandler<Compass, CompassReadingChangedEventArgs>(ReadingChanged);
                }
            }
        }
    }
    ```

You'll need to rename the namespace in the previous snippet with the name you gave your project. For example, if you created a project named **CompassCS**, you'd replace `namespace App1` with `namespace CompassCS`.

-   Open the file MainPage.xaml and replace the original contents with the following XML.

```xml
        <Page
        x:Class="App1.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:App1"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d">

        <Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
            <TextBlock HorizontalAlignment="Left" Height="22" Margin="8,18,0,0" TextWrapping="Wrap" Text="Magnetic Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFFBF9F9"/>
            <TextBlock HorizontalAlignment="Left" Height="18" Margin="8,58,0,0" TextWrapping="Wrap" Text="True North Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFF3F3F3"/>
            <TextBlock x:Name="txtMagnetic" HorizontalAlignment="Left" Height="22" Margin="130,18,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFFBF6F6"/>
            <TextBlock x:Name="txtNorth" HorizontalAlignment="Left" Height="18" Margin="130,58,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFF5F1F1"/>

         </Grid>
    </Page>

元のスニペットのクラス名の最初の部分を、自分のアプリの名前空間に置き換える必要があります。You'll need to replace the first part of the class name in the previous snippet with the namespace of your app. たとえば、作成したプロジェクトの名前が CompassCS だとすると、x:Class="App1.MainPage"x:Class="CompassCS.MainPage" に置き換えます。For example, if you created a project named CompassCS, you'd replace x:Class="App1.MainPage" with x:Class="CompassCS.MainPage". また、xmlns:local="using:App1"xmlns:local="using:CompassCS" に置き換える必要があります。You should also replace xmlns:local="using:App1" with xmlns:local="using:CompassCS".

  • F5 キーを押すか 、[デバッグ] [デバッグの開始] を選択してアプリを > Start Debuggingビルド、デプロイ、実行します。Press F5 or select Debug > Start Debugging to build, deploy, and run the app.

アプリを実行した後、デバイスを移動するか、エミュレーター ツールを使うことによって、コンパスの値を変更できます。Once the app is running, you can change the compass values by moving the device or using the emulator tools.

  • Visual Studio に戻り、Shift キーを押しながら F5 キーを押すか、[デバッグ] [ > デバッグの停止] を選択してアプリを停止し、アプリを停止します。Stop the app by returning to Visual Studio and pressing Shift+F5 or select Debug > Stop Debugging to stop the app.

説明Explanation

上に示した例では、ごく短いコードを作成するだけで、コンパス入力をアプリに組み込むことができることがわかります。The previous example demonstrates how little code you'll need to write in order to integrate compass input in your app.

このアプリでは、MainPage メソッドで、既定のコンパスとの接続を確立しています。The app establishes a connection with the default compass in the MainPage method.

_compass = Compass.GetDefault(); // Get the default compass object

このアプリでは、MainPage メソッドで、レポート間隔を設定しています。The app establishes the report interval within the MainPage method. 次のコードは、デバイスでサポートされる最小の間隔を取得し、要求される 16 ミリ秒の間隔 (約 60 Hz のリフレッシュ レート) と比較します。This code retrieves the minimum interval supported by the device and compares it to a requested interval of 16 milliseconds (which approximates a 60-Hz refresh rate). サポートされる最小の間隔が要求される間隔よりも大きい場合は、値を最小値に設定します。If the minimum supported interval is greater than the requested interval, the code sets the value to the minimum. それ以外の場合は、値を要求される間隔に設定します。Otherwise, it sets the value to the requested interval.

uint minReportInterval = _compass.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_compass.ReportInterval = reportInterval;

ReadingChanged メソッドで、新しいコンパス データをキャプチャしています。The new compass data is captured in the ReadingChanged method. センサーのドライバーは、センサーから新しいデータを受け取るたびに、このイベント ハンドラーを使ってアプリに値を渡します。Each time the sensor driver receives new data from the sensor, it passes the values to your app using this event handler. このアプリの場合、このイベント ハンドラーが次の行で登録されています。The app registers this event handler on the following line.

_compass.ReadingChanged += new TypedEventHandler<Compass,
CompassReadingChangedEventArgs>(ReadingChanged);

プロジェクトの XAML 内にある TextBlock に、これらの新しい値が書き込まれます。These new values are written to the TextBlocks found in the project's XAML.

 <TextBlock HorizontalAlignment="Left" Height="22" Margin="8,18,0,0" TextWrapping="Wrap" Text="Magnetic Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFFBF9F9"/>
 <TextBlock HorizontalAlignment="Left" Height="18" Margin="8,58,0,0" TextWrapping="Wrap" Text="True North Heading:" VerticalAlignment="Top" Width="104" Foreground="#FFF3F3F3"/>
 <TextBlock x:Name="txtMagnetic" HorizontalAlignment="Left" Height="22" Margin="130,18,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFFBF6F6"/>
 <TextBlock x:Name="txtNorth" HorizontalAlignment="Left" Height="18" Margin="130,58,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="116" Foreground="#FFF5F1F1"/>