가속도계를 사용하여 사용자 이동에 응답하는 방법을 알아봅니다.
이 예제에서는 가속도계를 입력 디바이스로 사용하는 간단한 앱을 만듭니다. 가속도계를 사용하여 사용자가 디바이스를 이동할 때 응답할 수 있습니다. 가속도계를 기반으로 하는 앱은 일반적으로 입력에 하나 또는 두 개의 축만 사용합니다.
- 중요한 API:Windows.Devices.Sensors, Accelerometer
Note
이 문서에서는 가속도계를 사용하는 방법을 보여 주는 코드에 중점을 둡니다. 가속도계 센서에 대한 개요는 센서: 가속도계를 참조하세요.
사전 요구 사항
가속도계 센서와 그 용도에 대해 잘 알고 있어야 합니다. 센서: 가속도계를 참조하세요.
사용 중인 디바이스는 가속도계를 지원해야 합니다.
예제 코드
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;
namespace DevicesDemo.Pages
{
public sealed partial class AccelerometerPage : Page
{
private Accelerometer? accelerometer;
public AccelerometerPage()
{
InitializeComponent();
// Get the default accelerometer sensor object.
accelerometer = Accelerometer.GetDefault();
if (accelerometer != null)
{
// Establish the report interval.
uint minReportInterval = accelerometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
accelerometer.ReportInterval = reportInterval;
// Assign an event handler for the reading-changed event.
accelerometer.ReadingChanged += Accelerometer_ReadingChanged;
}
else
{
statusBar.Message = "No accelerometer was found.";
statusBar.Severity = InfoBarSeverity.Error;
statusBar.IsOpen = true;
}
}
// This event handler writes the current accelerometer reading to
// the three acceleration text blocks on the XAML page.
private void Accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
AccelerometerReading reading = args.Reading;
txtXAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
txtYAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
txtZAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
});
}
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Margin="24">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
</Grid.RowDefinitions>
<TextBlock Text="X-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtXAxis" Grid.Column="1" Text="---"/>
<TextBlock Grid.Row="1" Text="Y-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtYAxis" Grid.Column="1" Grid.Row="1" Text="---"/>
<TextBlock Grid.Row="2" Text="Z-axis:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtZAxis" Grid.Column="1" Grid.Row="2" Text="---"/>
</Grid>
<InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>
앱이 실행되면 디바이스를 이동하여 가속도계 값을 변경할 수 있습니다.
이전 예제에서는 가속도계 입력을 앱에 통합하기 위해 작성해야 하는 필수 코드를 보여 줍니다.
센서에 연결
GetDefault 메서드를 호출하여 기본 가속도계와의 연결을 설정합니다.
private Accelerometer? accelerometer;
// ...
accelerometer = Accelerometer.GetDefault();
FromIdAsync를 호출하여 DeviceInformation.Id 값에서 Accelerometer 개체를 만들 수도 있습니다. 자세한 내용은 디바이스 열거를 참조하세요.
가속도계 센서가 검색되지 않으면 사용자에게 알리도록 상태 메시지가 업데이트됩니다.
보고서 간격 설정
보고서 간격은 페이지의 생성자 내에서 설정됩니다. 이 코드는 디바이스에서 지원하는 최소 간격을 검색하고 요청된 간격인 16밀리초(약 60Hz 새로 고침 속도)와 비교합니다. 지원되는 최소 간격이 요청된 간격보다 큰 경우 코드는 값을 최소값으로 설정합니다. 그렇지 않으면 값을 요청된 간격으로 설정합니다.
uint minReportInterval = accelerometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
accelerometer.ReportInterval = reportInterval;
센서 데이터 읽기
새로운 가속도계 데이터는 ReadingChanged 이벤트 처리기에서 캡처됩니다. 센서 드라이버가 센서에서 새 데이터를 받을 때마다 이 이벤트를 사용하여 값을 앱에 전달합니다. 이 예제에서는 이러한 새 값이 해당 페이지의 XAML에 있는 텍스트 블록에 기록됩니다.
accelerometer.ReadingChanged += Accelerometer_ReadingChanged;
// ...
private void Accelerometer_ReadingChanged(Accelerometer sender, AccelerometerReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
AccelerometerReading reading = args.Reading;
txtXAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationX);
txtYAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationY);
txtZAxis.Text = String.Format("{0,5:0.00}", reading.AccelerationZ);
});
}
또한 Shaken 이벤트를 또 다른 입력 소스로 사용할 수 있습니다. 이벤트에 대한 Shaken 지원은 하드웨어 및 드라이버 지원에 따라 달라집니다. 실제로 Shaken 이벤트를 지원하는 가속도계는 거의 없습니다.
관련 항목
Windows developer