Verwenden des Beschleunigungsmessers

Erfahren Sie, wie Sie den Beschleunigungsmesser verwenden, um auf Benutzerbewegungen zu reagieren.

In diesem Beispiel wird eine einfache App erstellt, die auf einem Beschleunigungsmesser als Eingabegerät basiert. Sie können den Beschleunigungsmesser verwenden, um zu reagieren, wenn ein Benutzer das Gerät verschiebt. Eine App, die auf einem Beschleunigungsmesser basiert, verwendet in der Regel nur eine oder zwei Achsen für die Eingabe.

Note

Dieser Artikel konzentriert sich auf Code, der die Verwendung eines Beschleunigungsmessers veranschaulicht. Eine Übersicht über den Beschleunigungsmessersensor finden Sie unter Sensoren: Beschleunigungsmesser.

Voraussetzungen

Sie sollten mit dem Beschleunigungsmessersensor und dessen Verwendung vertraut sein. Siehe Sensoren: Beschleunigungsmesser.

Das verwendete Gerät muss einen Beschleunigungsmesser unterstützen.

Beispielcode

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>

Wenn die App ausgeführt wird, können Sie die Beschleunigungsmesserwerte ändern, indem Sie das Gerät verschieben.

Im vorherigen Beispiel wird der wesentliche Code veranschaulicht, den Sie schreiben müssen, um Beschleunigungsmessereingaben in Ihre App zu integrieren.

Verbindung mit dem Sensor herstellen

Rufen Sie die GetDefault-Methode auf, um eine Verbindung mit dem Standardbeschleigungsmesser herzustellen.

private Accelerometer? accelerometer;
// ...
accelerometer = Accelerometer.GetDefault();

Sie können auch FromIdAsync aufrufen, um ein Accelerometerobjekt aus einem DeviceInformation.Idwert zu erstellen. Weitere Informationen finden Sie unter "Aufzählen von Geräten".

Wenn kein Beschleunigungsmessersensor erkannt wird, wird die Statusmeldung aktualisiert, um den Benutzer zu informieren.

Festlegen des Berichtsintervalls

Das Berichtsintervall wird im Konstruktor der Seite festgelegt. Dieser Code ruft das vom Gerät unterstützte Mindestintervall ab und vergleicht es mit einem angeforderten Intervall von 16 Millisekunden (was einer Aktualisierungsrate von 60 Hz entspricht). Wenn das unterstützte Mindestintervall größer als das angeforderte Intervall ist, legt der Code den Wert auf das Minimum fest. Andernfalls wird der Wert auf das angeforderte Intervall festgelegt.

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

Lesen von Sensordaten

Die neuen Beschleunigungsmesserdaten werden im ReadingChanged-Ereignishandler erfasst. Jedes Mal, wenn der Sensortreiber neue Daten vom Sensor empfängt, übergibt er die Werte mithilfe dieses Ereignisses an Ihre App. In diesem Beispiel werden diese neuen Werte in die Textblöcke geschrieben, die im XAML-Code für die entsprechende Seite enthalten sind.

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);
    });
}

Sie können das Shaken-Ereignis auch als eine andere Eingabequelle verwenden. Die Unterstützung für das Shaken Ereignis ist abhängig von der Unterstützung durch die Hardware und den Treiber. In der Praxis unterstützen sehr wenige Beschleunigungsmesser das Shaken Ereignis.