Verwenden des Gyrometers
Erfahren Sie, wie Sie das Gyrometer verwenden, um Änderungen der Benutzerbewegung zu erkennen.
Wichtige APIs
Voraussetzungen
Sie sollten mit Extensible Application Markup Language (XAML), Microsoft Visual C# und Ereignissen vertraut sein.
Das verwendete Gerät oder der Emulator muss ein Gyrometer unterstützen.
Erstellen einer einfachen Gyrometer-App
Gyrometer ergänzen Beschleunigungsmesser als Gamecontroller. Der Beschleunigungsmesser kann die lineare Bewegung messen, während das Gyrometer Winkelgeschwindigkeit oder Drehbewegung misst.
Hinweis
Eine umfassendere Implementierung finden Sie im Gyrometerbeispiel.
Anweisungen
Erstellen Sie ein neues Projekt, und wählen Sie eine leere App (Universelle Windows-App) aus den Visual C# -Projektvorlagen aus.
Öffnen Sie die MainPage.xaml.cs Datei Ihres Projekts, und ersetzen Sie den vorhandenen Code durch Folgendes.
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 gyrometer
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 Gyrometer _gyrometer; // Our app' s gyrometer object
// This event handler writes the current gyrometer reading to
// the three textblocks on the app' s main page.
private async void ReadingChanged(object sender, GyrometerReadingChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
GyrometerReading reading = e.Reading;
txtXAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityX);
txtYAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityY);
txtZAxis.Text = String.Format("{0,5:0.00}", reading.AngularVelocityZ);
});
}
public MainPage()
{
this.InitializeComponent();
_gyrometer = Gyrometer.GetDefault(); // Get the default gyrometer sensor object
if (_gyrometer != null)
{
// Establish the report interval for all scenarios
uint minReportInterval = _gyrometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_gyrometer.ReportInterval = reportInterval;
// Assign an event handler for the gyrometer reading-changed event
_gyrometer.ReadingChanged += new TypedEventHandler<Gyrometer, GyrometerReadingChangedEventArgs>(ReadingChanged);
}
}
}
}
Sie müssen den Namespace im vorherigen Codeausschnitt mit dem Namen umbenennen, den Sie ihrem Projekt gegeben haben. Wenn Sie beispielsweise ein Projekt mit dem Namen GyrometerCS erstellt haben, ersetzen Sie es durch namespace GyrometerCS
namespace App1
.
- Öffnen Sie die Datei "MainPage.xaml", und ersetzen Sie den ursprünglichen Inhalt durch den folgenden XML-Code.
<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="23" Margin="8,8,0,0" TextWrapping="Wrap" Text="X-Axis:" VerticalAlignment="Top" Width="46" Foreground="#FFFDFDFD"/>
<TextBlock x:Name="txtXAxis" HorizontalAlignment="Left" Height="23" Margin="67,8,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="88" Foreground="#FFFDFAFA"/>
<TextBlock HorizontalAlignment="Left" Height="20" Margin="8,52,0,0" TextWrapping="Wrap" Text="Y Axis:" VerticalAlignment="Top" Width="46" Foreground="White"/>
<TextBlock x:Name="txtYAxis" HorizontalAlignment="Left" Height="24" Margin="54,48,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="80" Foreground="#FFFBFBFB"/>
<TextBlock HorizontalAlignment="Left" Height="21" Margin="8,93,0,0" TextWrapping="Wrap" Text="Z Axis:" VerticalAlignment="Top" Width="46" Foreground="#FFFEFBFB"/>
<TextBlock x:Name="txtZAxis" HorizontalAlignment="Left" Height="21" Margin="54,93,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="63" Foreground="#FFF8F3F3"/>
</Grid>
</Page>
Sie müssen den ersten Teil des Klassennamens im vorherigen Codeausschnitt durch den Namespace Ihrer App ersetzen. Wenn Sie beispielsweise ein Projekt mit dem Namen GyrometerCS erstellt haben, ersetzen Sie es durch x:Class="GyrometerCS.MainPage"
x:Class="App1.MainPage"
. Sie sollten auch durch xmlns:local="using:App1"
xmlns:local="using:GyrometerCS"
.
- Drücken Sie F5, oder wählen Sie "Debuggen>starten" aus, um die App zu erstellen, bereitzustellen und auszuführen.
Sobald die App ausgeführt wird, können Sie die Gyrometerwerte ändern, indem Sie das Gerät verschieben oder die Emulatortools verwenden.
- Beenden Sie die App, indem Sie zu Visual Studio zurückkehren und UMSCHALT+F5 drücken, oder wählen Sie "Debuggen>beenden" aus, um die App zu beenden.
Erklärung
Im vorherigen Beispiel wird veranschaulicht, wie wenig Code Sie schreiben müssen, um Gyrometereingaben in Ihre App zu integrieren.
Die App stellt eine Verbindung mit dem Standard-Gyrometer in der MainPage-Methode her.
_gyrometer = Gyrometer.GetDefault(); // Get the default gyrometer sensor object
Die App richtet das Berichtsintervall innerhalb der MainPage-Methode ein. 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 = _gyrometer.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_gyrometer.ReportInterval = reportInterval;
Die neuen Gyrometerdaten werden in der ReadingChanged-Methode erfasst. Jedes Mal, wenn der Sensortreiber neue Daten vom Sensor empfängt, übergibt er die Werte mithilfe dieses Ereignishandlers an Ihre App. Die App registriert diesen Ereignishandler in der folgenden Zeile.
_gyrometer.ReadingChanged += new TypedEventHandler<Gyrometer,
GyrometerReadingChangedEventArgs>(ReadingChanged);
Diese neuen Werte werden in die TextBlocks geschrieben, die im XAML-Code des Projekts enthalten sind.
<TextBlock HorizontalAlignment="Left" Height="23" Margin="8,8,0,0" TextWrapping="Wrap" Text="X-Axis:" VerticalAlignment="Top" Width="46" Foreground="#FFFDFDFD"/>
<TextBlock x:Name="txtXAxis" HorizontalAlignment="Left" Height="23" Margin="67,8,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="88" Foreground="#FFFDFAFA"/>
<TextBlock HorizontalAlignment="Left" Height="20" Margin="8,52,0,0" TextWrapping="Wrap" Text="Y Axis:" VerticalAlignment="Top" Width="46" Foreground="White"/>
<TextBlock x:Name="txtYAxis" HorizontalAlignment="Left" Height="24" Margin="54,48,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="80" Foreground="#FFFBFBFB"/>
<TextBlock HorizontalAlignment="Left" Height="21" Margin="8,93,0,0" TextWrapping="Wrap" Text="Z Axis:" VerticalAlignment="Top" Width="46" Foreground="#FFFEFBFB"/>
<TextBlock x:Name="txtZAxis" HorizontalAlignment="Left" Height="21" Margin="54,93,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="63" Foreground="#FFF8F3F3"/>