내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 나침반 센서에서 데이터를 가져오는 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

이 항목에서는 나침반 데이터의 수치를 표시하고 이를 그래픽으로 표현하는 나침반 앱을 만드는 과정을 안내합니다. 이 연습에서는 나침반 보정 대화 상자를 구현하는 방법도 보여 줍니다.

참고참고:

이 항목에서 설명한 Microsoft.Devices.Sensors 네임스페이스의 API 외에도 Windows.Devices.Sensors 네임스페이스에서 유사한 클래스를 사용하여 휴대폰의 센서를 프로그래밍할 수도 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

Compass(자기계) 센서를 사용하여 지구의 자북극을 기준으로 장치가 회전된 각도를 확인하는 데 사용할 수 있습니다. 앱은 장치 주변의 자기력을 감지하는 데 원시 자기계의 판독값을 사용할 수도 있습니다. 나침반 센서가 모든 Windows Phone 장치에 필요한 것은 아닙니다. 앱을 디자인하고 구현할 때 이러한 사실을 고려하는 것이 중요합니다. 앱은 센서를 사용할 수 있는지를 항상 확인하여 사용할 수 없는 경우 대체 입력 메커니즘을 제공하거나 안정적으로 중단되도록 합니다.

나침반 API는 단일 축을 사용해 장치 방향에 따라 방향을 계산합니다. 모든 축에서 단말기 방향을 사용하는 앱을 만들려면 Motion 클래스의 RotationMatrix 속성을 사용해야 합니다.

장치의 나침반 센서는 시간이 지남에 따라 정확도가 떨어질 수 있습니다(특히 자기장에 노출되는 경우). 이 경우 간단한 사용자 작업을 통해 나침반을 다시 보정할 수 있습니다. 시스템에서 +/-20도보다 큰 방향 정확도를 검색할 때마다 Calibrate 이벤트가 발생합니다. 이 예제에서는 사용자가 나침반을 보정할 수 있도록 보정 대화 상자를 구현하는 방법을 보여 줍니다.

다음 단계에서는 나침반 앱을 만드는 방법을 보여 줍니다.

중요중요:

이 앱은 에뮬레이터에서 테스트할 수 없습니다. 에뮬레이터가 나침반을 지원하지 않습니다. 이 앱은 등록된 휴대폰에서 테스트만 할 수 있습니다.

나침반 앱을 만들려면

  1. Visual Studio 에서 새 Windows Phone 앱  프로젝트를 만듭니다. 이 템플릿은 Windows Phone 카테고리에 있습니다.

  2. 이 앱은 센서 API가 들어 있는 Microsoft.Devices.Sensors 어셈블리에 대한 참조를 필요로 합니다. 나침반 데이터 중 일부는 XNA Framework Vector3 개체 형식으로 전달되므로 XNA Framework에 대한 참조도 필요합니다. 이 어셈블리는 이미 Windows Phone 8 을 대상으로 하는 프로젝트에서 참조되었습니다.

  3. MainPage.xaml 파일에서 "ContentPanel"이라는 Grid 요소에 다음 XAML 코드를 삽입합니다. 이 XAML 코드는 나침반 데이터를 표시하는 UI를 만듭니다. TextBlock 요소를 사용하여 나침반 데이터를 수치로 표시합니다. 또한 Line 요소를 사용하여 방향 및 원시 나침반 데이터를 그래픽으로 표시합니다.

    <StackPanel Orientation="Vertical">
      <StackPanel Orientation="Horizontal">
        <TextBlock>status: </TextBlock>
        <TextBlock Name="statusTextBlock"></TextBlock>
      </StackPanel>
      <StackPanel Orientation="Horizontal">
        <TextBlock>time between updates:</TextBlock>
        <TextBlock Name="timeBetweenUpdatesTextBlock"></TextBlock>
      </StackPanel>
      <StackPanel Orientation="Horizontal">
        <TextBlock>magnetic heading: </TextBlock>
        <TextBlock Name="magneticTextBlock"></TextBlock>
      </StackPanel>
      <StackPanel Orientation="Horizontal">
        <TextBlock>true heading: </TextBlock>
        <TextBlock Name="trueTextBlock"></TextBlock>
      </StackPanel>
      <StackPanel Orientation="Horizontal">
        <TextBlock>heading accuracy: </TextBlock>
        <TextBlock Name="accuracyTextBlock"></TextBlock>
      </StackPanel>
      <StackPanel Orientation="Horizontal">
        <TextBlock>compass orientation mode:</TextBlock>
        <TextBlock Name="orientationTextBlock"></TextBlock>
      </StackPanel>
      <Grid Height="200" Name="headingGrid">
        <TextBlock Foreground="Yellow" FontSize="16">magnetic heading</TextBlock>
        <TextBlock Foreground="Orange" FontSize="16" Margin="0,18">true heading</TextBlock>
        <Line x:Name="magneticLine" X1="240" Y1="100" X2="240" Y2="0" Stroke="Yellow" StrokeThickness="4"></Line>
        <Line x:Name="trueLine" X1="240" Y1="100" X2="240" Y2="0" Stroke="Orange" StrokeThickness="4"></Line>
      </Grid>
      <TextBlock Text="raw magnetometer data:"></TextBlock>
      <Grid>
        <TextBlock Height="30" HorizontalAlignment="Left" Name="xTextBlock" Text="X: 1.0" VerticalAlignment="Top" Foreground="Red" FontWeight="Bold"/>
        <TextBlock Height="30" HorizontalAlignment="Center" Name="yTextBlock" Text="Y: 1.0" VerticalAlignment="Top" Foreground="Green" FontWeight="Bold"/>
        <TextBlock Height="30" HorizontalAlignment="Right"  Name="zTextBlock" Text="Z: 1.0" VerticalAlignment="Top"  Foreground="Blue" FontWeight="Bold"/>
      </Grid>
      <Grid Height="140">
        <Line x:Name="xLine" X1="240" Y1="40" X2="240" Y2="40" Stroke="Red" StrokeThickness="14"></Line>
        <Line x:Name="yLine" X1="240" Y1="70" X2="240" Y2="70" Stroke="Green" StrokeThickness="14"></Line>
        <Line x:Name="zLine" X1="240" Y1="100" X2="240" Y2="100" Stroke="Blue" StrokeThickness="14"></Line>
      </Grid>
    </StackPanel>
    
    
    

    UI 표시 방식은 다음과 같습니다.

    UI for the compass application
  4. 다음으로, 이전 단계에서 추가한 코드 바로 다음에 나침반 교정 UI를 정의하는 XAML을 추가합니다. 이 UI는 나침반을 보정하기 위해 장치를 이동할 방법에 대한 지침과 이미지를 사용자에게 표시합니다. 바깥쪽 StackPanelVisibility.Collapsed로 설정되므로 사용자가 볼 수 없도록 숨겨집니다. UI를 표시하는 코드는 이 연습의 뒷부분에 나와 있습니다.

    <!--Calibration UI-->
    <StackPanel Name="calibrationStackPanel" Background="Black" Opacity="1" Visibility="Collapsed">
      <Image Source="/Images/calibrate_compass.png" Opacity=".95" HorizontalAlignment="Center"/>
      <TextBlock TextWrapping="Wrap" TextAlignment="Center">The compass on your device needs to be calibrated.
      Hold the device in front of you and sweep it through a figure 8 pattern as shown
      until the calibration is complete.</TextBlock>
      <StackPanel Orientation="Horizontal" Margin="0,10" HorizontalAlignment="Center">
        <TextBlock>heading accuracy:</TextBlock>
        <TextBlock Name="calibrationTextBlock">0.0°</TextBlock>  
      </StackPanel>
      <Button Name="calibrationButton" Content="Done" Click="calibrationButton_Click"></Button>
    </StackPanel>
    <!--End Calibration UI-->
    
    

    보정 UI는 표시 방식은 다음과 같습니다.

    UI for the compass calibration screen
  5. 위에서 정의한 나침반 보정 UI의 경우 나침반을 보정하기 위해 사용자가 단말기에서 스윕해야 하는 패턴을 나타내는 이미지를 사용합니다. 솔루션에 이미지를 추가하려면 먼저 새 폴더를 만듭니다. 새 폴더를 추가하려면, 솔루션 탐색기에서 앱 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 추가 -> 새 폴더를 선택합니다. 새 폴더의 이름을 Images로 지정합니다. 솔루션 탐색기에서 새 폴더를 마우스 오른쪽 버튼으로 클릭하고 추가 -> 기존 항목을 선택합니다. 이미지를 선택하고 추가를 클릭합니다. 이미지 calibrate_compass.png의 이름을 바꿉니다. 이미지를 추가한 후 솔루션 탐색기에서 이미지 아이콘을 마우스 오른쪽 버튼으로 클릭하고 속성을 선택합니다. 빌드 작업 속성이 콘텐츠로 설정되어 있는지 확인합니다.

    이 샘플에서 사용되는 이미지는 원시 센서 데이터 샘플과 함께 포함되어 있습니다.

  6. MainPage.xaml에 마지막으로 추가하는 UI 코드는 나침반에서 데이터 가져오기 작업을 시작 및 중지하는 버튼이 하나 포함된 앱 바의 정의입니다. XAML 코드의 마지막 줄 </phone:PhoneApplicationPage> 앞에 다음 코드를 붙여넣습니다.

    <phone:PhoneApplicationPage.ApplicationBar>
      <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
        <shell:ApplicationBarIconButton IconUri="/Images/onoff.png" Text="on/off" Click="ApplicationBarIconButton_Click"/>
      </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
    
    
  7. 이제 MainPage.xaml.cs 코드 숨김 페이지를 열고 페이지 맨 위의 다른 using 지시문에 센서 및 XNA Framework 네임스페이스에 대한 using 지시문을 추가합니다. 이 예제에서는 타이머를 사용하여 UI를 업데이트하므로 System.Windows.Threading 네임스페이스도 포함하세요.

    using Microsoft.Devices.Sensors;
    using Microsoft.Xna.Framework;
    using System.Windows.Threading;
    
    
  8. MainPage 클래스 정의 맨 위에 멤버 변수 몇 개를 선언합니다.

    public partial class MainPage : PhoneApplicationPage
    {
      Compass compass;
      DispatcherTimer timer;
    
      double magneticHeading;
      double trueHeading;
      double headingAccuracy;
      Vector3 rawMagnetometerReading;
      bool isDataValid;
    
      bool calibrating = false;
    
    

    첫 번째 변수는 Compass 형식 개체로, 나침반 센서에서 데이터를 가져오는 데 사용됩니다. 다음으로, UI를 주기적으로 업데이트하는 데 사용되는 DispatcherTimer를 선언합니다. 그런 다음 나침반 데이터를 포함할 변수 집합을 선언합니다. 이러한 변수 집합은 Compass API를 사용하여 설정되며, DispatcherTimerDispatcherTimer.Tick 이벤트에 표시됩니다. 마지막으로 부울 변수 calibrating을 사용하여 보정 대화 상자가 현재 표시되어 있는지 추적합니다.

  9. 페이지 생성자에서 앱이 실행되고 있는 단말기가 나침반 센서를 지원하는지 확인합니다. 일부 단말기는 일부 센서를 지원하지 않으므로, 센서를 사용하기 전에 항상 확인해야 합니다. 나침반이 지원되지 않는 경우 사용자에게 메시지가 표시되고 앱 바가 숨겨집니다. 나침반이 지원되는 경우에는 DispatcherTimer가 초기화되고 이벤트 처리기가 할당되지만, 이 시점에 타이머가 시작되지는 않습니다. 기존 페이지 생성자를 다음 코드로 바꿉니다.

    timer_Tick 이벤트 처리기는 나중에 추가됩니다.

    // Constructor
    public MainPage()
    {
      InitializeComponent();
    
      if (!Compass.IsSupported)
      {
        // The device on which the application is running does not support
        // the compass sensor. Alert the user and hide the
        // application bar.
        statusTextBlock.Text = "device does not support compass";
        ApplicationBar.IsVisible = false;
      }
      else
      {
        // Initialize the timer and add Tick event handler, but don't start it yet.
        timer = new DispatcherTimer();
        timer.Interval = TimeSpan.FromMilliseconds(30);
        timer.Tick += new EventHandler(timer_Tick);
      }
    }
    
    
  10. 앱 바 버튼에 Click 이벤트 처리기를 추가합니다. 이 항목 앞부분에서 XAML 코드를 추가한 방법에 따라 Visual Studio 에서 이 처리기가 추가되었을 수 있습니다. 추가된 경우 처리기 내에서 코드를 모두 제거합니다. 처리기가 자동으로 추가되지 않은 경우에는 다음의 빈 함수를 복사하여 MainPage 클래스 정의에 붙여 넣습니다.

    private void ApplicationBarIconButton_Click(object sender, EventArgs e)
    {
              
    }
    
    
  11. 앱 바 버튼 클릭 처리기에서 먼저 Compass 개체가 null이 아니고 데이터를 수신하는지 확인합니다. 해당 개체가 null이 아니고 데이터를 수신하는 경우 사용자가 버튼을 클릭하여 나침반을 중지하게 되므로, CompassDispatcherTimer에서 모두 Stop()을 호출합니다. 다음 코드를 빈 버튼 클릭 처리기 내에 붙여 넣습니다.

      if (compass != null && compass.IsDataValid)
      {
        // Stop data acquisition from the compass.
        compass.Stop();
        timer.Stop();
        statusTextBlock.Text = "compass stopped.";
      }
    
    
  12. 다음으로, 코드에서 사용자가 나침반을 시작하는 사례를 처리합니다. Compass 개체가 null이면 새 인스턴스를 만들고, 업데이트 사이에 원하는 시간 간격을 설정합니다. 각 장치의 센서가 지원하는 업데이트 간격은 서로 다릅니다. 이 예제에서는 속성이 설정된 후 해당 속성을 쿼리하여 센서의 실제 간격을 사용자에게 표시합니다. 다음으로, CurrentValueChanged 이벤트에 대한 이벤트 처리기가 추가됩니다. 이 이벤트는 나침반에 새 데이터가 있을 때마다 발생하며, Calibrate 이벤트는 나침반을 보정해야 할 때 발생합니다. 위의 코드 섹션 뒤에 있는 버튼 클릭 처리기 내에 이 코드를 붙여 넣습니다.

    else 블록용의 닫는 중괄호는 다음 단계에서 추가됩니다.

      else
      {
        if (compass == null)
        {
          // Instantiate the compass.
          compass = new Compass();
    
          // Specify the desired time between updates. The sensor accepts
          // intervals in multiples of 20 ms.
          compass.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20);
    
          // The sensor may not support the requested time between updates.
          // The TimeBetweenUpdates property reflects the actual rate.
          timeBetweenUpdatesTextBlock.Text = compass.TimeBetweenUpdates.TotalMilliseconds + " ms";
    
    
          compass.CurrentValueChanged +=
              new EventHandler<SensorReadingEventArgs<CompassReading>>(compass_CurrentValueChanged);
          compass.Calibrate +=
              new EventHandler<CalibrationEventArgs>(compass_Calibrate);
        }
    
    
    
  13. 이제 Start() 메서드를 사용하여 나침반을 시작합니다. Start 호출에 실패할 수 있으므로, try 블록에 이 호출을 포함해야 합니다. catch 블록에서는 나침반을 시작할 수 없다는 알림을 사용자에게 표시할 수 있습니다. 이 코드는 DispatcherTimer.도 시작합니다. 위의 코드 섹션 뒤에 있는 시작 버튼 클릭 처리기에 이 코드를 붙여 넣습니다.

        try
        {
          statusTextBlock.Text = "starting compass.";
          compass.Start();
          timer.Start();
        }
        catch (InvalidOperationException)
        {
          statusTextBlock.Text = "unable to start compass.";
        }
    
      }
    
    
  14. 이제 CurrentValueChanged 이벤트 처리기를 구현합니다. 시스템에서는 새 나침반 데이터를 사용해 TimeBetweenUpdates로 지정한 빈도로 이 메서드를 호출합니다. 처리기는 나침반 데이터가 포함된 CompassReading 개체를 수신합니다. 이 처리기는 UI에 액세스할 수 없는 백그라운드 스레드에서 호출됩니다. 그러므로 이 메서드에서 UI를 수정하려면 Dispatcher.BeginInvoke를 사용하여 UI 스레드에 대한 코드를 호출해야 합니다. 이 예제에서는 발송자 타이머를 사용해 UI를 업데이트하므로, 이 메서드는 단순히 클래스 멤버 변수의 값을 CompassReading 개체의 값으로 설정합니다. 이 앱에서는 방향의 기호가 아닌 정확도만 사용하므로, Abs 함수를 사용해 방향 정확도의 절대값을 가져옵니다.

    void compass_CurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e)
    {
      // Note that this event handler is called from a background thread
      // and therefore does not have access to the UI thread. To update 
      // the UI from this handler, use Dispatcher.BeginInvoke() as shown.
      // Dispatcher.BeginInvoke(() => { statusTextBlock.Text = "in CurrentValueChanged"; });
    
    
      isDataValid = compass.IsDataValid;
    
      trueHeading = e.SensorReading.TrueHeading;
      magneticHeading = e.SensorReading.MagneticHeading;
      headingAccuracy = Math.Abs(e.SensorReading.HeadingAccuracy);
      rawMagnetometerReading = e.SensorReading.MagnetometerReading;
                
    }
    
    
  15. DispatcherTimer.Tick 이벤트 처리기를 구현하여 현재 나침반 판독값으로 UI를 업데이트합니다. 나침반이 현재 보정되고 있는지 여부에 따라 이 메서드의 동작이 달라집니다. 보정을 수행하고 있지 않으면 TextBlock 상태가 업데이트되어 데이터를 수신 중임을 나타냅니다. 다음으로, TextBlock 개체가 업데이트되어 자기 방향, 자북극 기준 방향, 실제 방향(진북극 기준 방향), 그리고 나침반 판독값의 오류를 표시하는 방향 정확도를 표시합니다. 그런 다음 Line 개체가 업데이트되어 나침반 판독값을 그래픽으로 표시합니다. Microsoft.Xna.Framework 라이브러리의 MathHelper 클래스를 사용하여 판독값을 삼각 함수에서 사용할 수 있도록 도에서 라디안으로 변환합니다. 다음으로, 원시 자기계 판독값을 수치와 그래픽으로 표시합니다. 다음 코드를 MainPage.xaml.cs에 붙여 넣으세요. 이 메서드의 나머지 부분은 다음 단계에 나옵니다.

    timer_Tick 메서드용의 닫는 중괄호는 다음 단계에서 추가됩니다.

    void timer_Tick(object sender, EventArgs e)
    {
      if (!calibrating)
      {
        if (isDataValid)
        {
          statusTextBlock.Text = "receiving data from compass.";
        }
    
        // Update the textblocks with numeric heading values
        magneticTextBlock.Text = magneticHeading.ToString("0.0");
        trueTextBlock.Text = trueHeading.ToString("0.0");
        accuracyTextBlock.Text = headingAccuracy.ToString("0.0");
    
        // Update the line objects to graphically display the headings
        double centerX = headingGrid.ActualWidth / 2.0;
        double centerY = headingGrid.ActualHeight / 2.0;
        magneticLine.X2 = centerX - centerY * Math.Sin(MathHelper.ToRadians((float)magneticHeading));
        magneticLine.Y2 = centerY - centerY * Math.Cos(MathHelper.ToRadians((float)magneticHeading));
        trueLine.X2 = centerX - centerY * Math.Sin(MathHelper.ToRadians((float)trueHeading));
        trueLine.Y2 = centerY - centerY * Math.Cos(MathHelper.ToRadians((float)trueHeading));
    
        // Update the textblocks with numeric raw magnetometer readings
        xTextBlock.Text = rawMagnetometerReading.X.ToString("0.00");
        yTextBlock.Text = rawMagnetometerReading.Y.ToString("0.00");
        zTextBlock.Text = rawMagnetometerReading.Z.ToString("0.00");
    
        // Update the line objects to graphically display raw data
        xLine.X2 = xLine.X1 + rawMagnetometerReading.X * 4;
        yLine.X2 = yLine.X1 + rawMagnetometerReading.Y * 4;
        zLine.X2 = zLine.X1 + rawMagnetometerReading.Z * 4;
      }
    
    
  16. DispatcherTimer.Tick 이벤트 처리기의 두 번째 부분에서는 나침반을 보정하기 위해 UI를 업데이트합니다. 이 UI는 기본적으로 사용자에게 표시되지 않습니다. UI를 표시하는 코드는 다음 단계에 나와 있습니다. 이 코드는 단순히 HeadingAccuracy 값 자체만 평가합니다. 해당 값이 10도 이하이면 나침반이 보정된 것으로 간주되므로, 텍스트 색이 녹색으로 설정되고 사용자에게 보정이 완료되었다는 알림이 표시됩니다. 그렇지 않으면 텍스트가 빨간색으로 설정되고 방향 정확도의 수치 값이 표시됩니다. 먼저 using 문을 추가하여 브러시 및 색 사용을 지원합니다.

    using System.Windows.Media;
    

    그런 다음 이전 단계의 코드 뒤에 다음 코드를 붙여 넣어 DispatcherTimer.Tick 이벤트 처리기를 완성합니다.

      else
      {
        if (headingAccuracy <= 10)
        {
          calibrationTextBlock.Foreground = new SolidColorBrush(Colors.Green);
          calibrationTextBlock.Text = "Complete!";
        }
        else
        {
          calibrationTextBlock.Foreground = new SolidColorBrush(Colors.Red);
          calibrationTextBlock.Text = headingAccuracy.ToString("0.0");
        }
      }
    }
    
    
  17. 다음으로, Calibrate 이벤트 처리기를 구현합니다. 이 이벤트는 시스템에서 +/20도보다 큰 나침반 방향 정확도를 검색할 때마다 발생합니다. 이 이벤트 처리기에서는 보정 UI를 표시하고 calibrating 멤버 변수를 true로 설정하기만 하면 됩니다. 이 이벤트 처리기는 UI 스레드에서 호출되지 않으므로, UI를 업데이트하는 코드는 Dispatcher.Invoke를 사용해 호출합니다.

    void compass_Calibrate(object sender, CalibrationEventArgs e)
    {
      Dispatcher.BeginInvoke(() => { calibrationStackPanel.Visibility = Visibility.Visible; });
      calibrating = true;
    }
    
    
  18. 마지막으로 보정 UI의 버튼에 대한 Click 이벤트 처리기를 구현합니다. 사용자는 보정이 완료되면 이 버튼을 탭합니다. 이 메서드는 보정 UI를 숨기고 calibrating 멤버 변수를 false로 설정하기만 합니다.

    private void calibrationButton_Click(object sender, RoutedEventArgs e)
    {
      calibrationStackPanel.Visibility = Visibility.Collapsed;
      calibrating = false;
    }
    
    

나침반 API는 다른 축을 사용하여 휴대폰 방향에 따라 방향을 계산합니다. 다음 코드는 예제 앱을 수정하여 나침반이 런타임에 사용하는 방향을 확인합니다.

나침반 방향 모드를 확인하려면

  1. 먼저 클래스 맨 위에 Accelerometer 유형의 멤버 변수를 다른 멤버 변수와 함께 추가합니다.

    Accelerometer accelerometer;
    
    
  2. 다음으로, 응용프로그램 모음 버튼 클릭 처리기에서 CompassDispatcherTimer에 대한 Stop 메서드를 호출한 직후에 가속도계의 Stop() 메서드를 호출합니다.

    
    …
    compass.Stop();
    timer.Stop();
    // Add the following line
    accelerometer.Stop();
    
    
  3. 그런 다음 역시 응용프로그램 모음 버튼 클릭 처리기에서 Accelerometer 개체를 초기화하고, CurrentValueChanged에 대한 이벤트 처리기를 연결한 후 Start()를 호출합니다. CompassDispatcherTimer에 대한 Start를 호출한 후 아래 코드를 추가합니다.

    …
    statusTextBlock.Text = "starting compass.";
    compass.Start();
    timer.Start();
    
    // add the following lines
    accelerometer = new Accelerometer();
    accelerometer.CurrentValueChanged +=
        new EventHandler<SensorReadingEventArgs<AccelerometerReading>>(accelerometer_CurrentValueChanged);
    accelerometer.Start();
    
    
  4. 마지막으로 Accelerometer 개체의 CurrentValueChanged 이벤트에 대한 이벤트 처리기를 구현합니다. 이 메서드는 가속 판독값을 나타내는 Vector3 개체를 가져와 삼각 함수를 사용해 장치 방향을 확인합니다. 마지막으로 UI가 현재 나침반 모드로 업데이트됩니다. 이 이벤트는 UI 스레드에서 호출되지 않으므로 Dispatcher.BeginInvoke는 UI를 업데이트하는 데 사용됩니다.

    void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
    {
      Vector3 v = e.SensorReading.Acceleration;
    
      bool isCompassUsingNegativeZAxis = false;
    
      if (Math.Abs(v.Z) < Math.Cos(Math.PI / 4) &&
                    (v.Y < Math.Sin(7 * Math.PI / 4)))
      {
        isCompassUsingNegativeZAxis = true;
      }
    
      Dispatcher.BeginInvoke(() =>
          { orientationTextBlock.Text = (isCompassUsingNegativeZAxis) ? "portrait mode" : "flat mode"; });
    }
    
    

표시:
© 2014 Microsoft