Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Erfahren Sie, wie Sie die Ausrichtungssensoren verwenden, um die Geräteausrichtung zu bestimmen.
In diesem Beispiel wird eine einfache App erstellt, die auf einem Ausrichtungssensor als Eingabegerät basiert. Ein Ausrichtungssensor ist eine der verschiedenen Arten von Umgebungssensoren, mit denen Apps auf Änderungen der Geräteausrichtung reagieren können.
- Wichtige APIs:Windows.Devices.Sensors, OrientationSensor, SimpleOrientationSensor
Note
Dieser Artikel konzentriert sich auf Code, der die Verwendung eines Ausrichtungssensors veranschaulicht. Eine Übersicht über die Ausrichtungssensoren finden Sie unter Sensoren: Ausrichtungssensor.
Voraussetzungen
Sie sollten mit dem Ausrichtungssensor und dessen Verwendung vertraut sein. Siehe Sensoren: Ausrichtungssensor.
Das verwendete Gerät muss einen Ausrichtungssensor unterstützen.
Ausrichtungssensortypen
Es gibt zwei verschiedene Arten von APIs für Ausrichtungssensoren, die im Namespace Windows.Devices.Sensors enthalten sind: OrientationSensor und SimpleOrientation. Während beide Sensoren Ausrichtungssensoren sind, wird dieser Begriff überlastet und für sehr unterschiedliche Zwecke verwendet. Da beide Ausrichtungssensoren jedoch sind, werden beide in diesem Artikel behandelt.
Die OrientationSensor-API wird für 3D-Apps verwendet, um eine Quaternion und eine Drehungsmatrix zu erhalten. Eine Quaternion kann am einfachsten als Drehung eines Punkts [x,y,z] über eine beliebige Achse verstanden werden (im Gegensatz zu einer Drehungsmatrix, die Drehungen um drei Achsen darstellt). Die Mathematik hinter Quaternionen ist ziemlich exotisch, da sie die geometrischen Eigenschaften komplexer Zahlen und mathematischer Eigenschaften von imaginären Zahlen umfasst, aber das Arbeiten mit ihnen ist einfach, und Frameworks wie DirectX unterstützen sie. Eine komplexe 3D-App kann den Ausrichtungssensor verwenden, um die Perspektive des Benutzers anzupassen. Dieser Sensor kombiniert Eingaben aus Beschleunigungsmesser, Gyrometer und Kompass.
Die SimpleOrientationSensor-API wird verwendet, um die aktuelle physische Ausrichtung des Geräts anhand von Definitionen wie Hochformat oben, Hochformat unten, Querformat links und Querformat rechts zu bestimmen. Es kann auch erkennen, ob ein Gerät mit der Vorderseite nach oben oder nach unten liegt. Anstatt Werte wie „Hochformat nach oben“ oder „Querformat links“ zurückzugeben, gibt dieser Sensor einen Rotationswert zurück: „Nicht gedreht“, „Um 90 Grad gegen den Uhrzeigersinn gedreht“ usw. Die folgende Tabelle ordnet allgemeine Ausrichtungseigenschaften dem entsprechenden Sensorlesewert zu.
| Orientierung | Entsprechende Sensorlesewerte |
|---|---|
| Hochformat | NotRotated |
| Querformat links | Um90GradGegenDenUhrzeigersinnGedreht |
| Hochformat unten | Um180GradGegenDenUhrzeigersinnGedreht |
| Querformat rechts | Um 270 Grad gegen den Uhrzeigersinn gedreht |
Beispielcode – Ausrichtungssensor
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;
namespace DevicesDemo.Pages
{
public sealed partial class OrientationSensorPage : Page
{
private OrientationSensor? orientationSensor;
public OrientationSensorPage()
{
InitializeComponent();
// Get the default orientation sensor object.
orientationSensor = OrientationSensor.GetDefault();
if (orientationSensor != null)
{
// Establish the report interval.
uint minReportInterval = orientationSensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
orientationSensor.ReportInterval = reportInterval;
// Assign an event handler for the reading-changed event.
orientationSensor.ReadingChanged += OrientationSensor_ReadingChanged;
}
else
{
statusBar.Message = "No orientation sensor was found.";
statusBar.Severity = InfoBarSeverity.Error;
statusBar.IsOpen = true;
}
}
// This event handler writes the current orientation
// reading to the text blocks on the XAML page.
private void OrientationSensor_ReadingChanged(OrientationSensor sender, OrientationSensorReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
OrientationSensorReading reading = args.Reading;
// Quaternion values
txtQuaternionX.Text = String.Format("{0,8:0.00000}", reading.Quaternion.X);
txtQuaternionY.Text = String.Format("{0,8:0.00000}", reading.Quaternion.Y);
txtQuaternionZ.Text = String.Format("{0,8:0.00000}", reading.Quaternion.Z);
txtQuaternionW.Text = String.Format("{0,8:0.00000}", reading.Quaternion.W);
// Rotation Matrix values
txtM11.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M11);
txtM12.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M12);
txtM13.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M13);
txtM21.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M21);
txtM22.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M22);
txtM23.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M23);
txtM31.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M31);
txtM32.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M32);
txtM33.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M33);
});
}
}
}
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Grid Margin="24">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto" MinWidth="66"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto" MinWidth="66"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto" MinWidth="66"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
</Grid.RowDefinitions>
<TextBlock Text="M11:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM11" Grid.Column="1" Text="---"/>
<TextBlock Text="M12:" Grid.Row="1" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM12" Grid.Column="1" Grid.Row="1" Text="---"/>
<TextBlock Text="M13:" Grid.Row="2" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM13" Grid.Column="1" Grid.Row="2" Text="---"/>
<TextBlock Text="M21:" Grid.Column="2" Grid.Row="0" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM21" Grid.Column="3" Grid.Row="0" Text="---"/>
<TextBlock Text="M22:" Grid.Column="2" Grid.Row="1" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM22" Grid.Column="3" Grid.Row="1" Text="---"/>
<TextBlock Text="M23:" Grid.Column="2" Grid.Row="2" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM23" Grid.Column="3" Grid.Row="2" Text="---"/>
<TextBlock Text="M31:" Grid.Column="4" Grid.Row="0" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM31" Grid.Column="5" Grid.Row="0" Text="---"/>
<TextBlock Text="M32:" Grid.Column="4" Grid.Row="1" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM32" Grid.Column="5" Grid.Row="1" Text="---"/>
<TextBlock Text="M33:" Grid.Column="4" Grid.Row="2" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtM33" Grid.Column="5" Grid.Row="2" Text="---"/>
</Grid>
<Grid Margin="24" Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
<RowDefinition Height="44"/>
</Grid.RowDefinitions>
<TextBlock Text="Quaternion X:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtQuaternionX" Grid.Column="1" Grid.Row="0" Text="---"/>
<TextBlock Text="Quaternion Y:" Grid.Row="1" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtQuaternionY" Grid.Column="1" Grid.Row="1" Text="---"/>
<TextBlock Text="Quaternion Z:" Grid.Row="2" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtQuaternionZ" Grid.Column="1" Grid.Row="2" Text="---"/>
<TextBlock Text="Quaternion W:" Grid.Row="3" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtQuaternionW" Grid.Column="1" Grid.Row="3" Text="---"/>
</Grid>
<InfoBar x:Name="statusBar" Grid.Row="2"/>
</Grid>
Wenn die App ausgeführt wird, können Sie die Ausrichtungswerte ändern, indem Sie das Gerät verschieben.
Im vorherigen Beispiel wird der wesentliche Code veranschaulicht, den Sie schreiben müssen, um die Eingabe des Ausrichtungssensors in Ihre App zu integrieren.
Verbindung mit dem Sensor herstellen
Rufen Sie die GetDefault-Methode auf, um eine Verbindung mit dem Standardausrichtungssensor herzustellen.
private OrientationSensor? orientationSensor;
// ...
orientationSensor = OrientationSensor.GetDefault();
Sie können auch FromIdAsync aufrufen, um einOrientationSensorobjekt aus einem DeviceInformation.Idwert zu erstellen. Weitere Informationen finden Sie unter "Aufzählen von Geräten".
Wenn kein Ausrichtungssensor 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 = orientationSensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
orientationSensor.ReportInterval = reportInterval;
Lesen von Sensordaten
Die neuen Ausrichtungssensordaten 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.
orientationSensor.ReadingChanged += OrientationSensor_ReadingChanged;
// ...
private void OrientationSensor_ReadingChanged(OrientationSensor sender, OrientationSensorReadingChangedEventArgs args)
{
DispatcherQueue?.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
OrientationSensorReading reading = args.Reading;
// Quaternion values
txtQuaternionX.Text = String.Format("{0,8:0.00000}", reading.Quaternion.X);
txtQuaternionY.Text = String.Format("{0,8:0.00000}", reading.Quaternion.Y);
txtQuaternionZ.Text = String.Format("{0,8:0.00000}", reading.Quaternion.Z);
txtQuaternionW.Text = String.Format("{0,8:0.00000}", reading.Quaternion.W);
// Rotation Matrix values
txtM11.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M11);
txtM12.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M12);
txtM13.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M13);
txtM21.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M21);
txtM22.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M22);
txtM23.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M23);
txtM31.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M31);
txtM32.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M32);
txtM33.Text = String.Format("{0,8:0.00000}", reading.RotationMatrix.M33);
});
}
Beispielcode – einfacher Ausrichtungssensor
using Microsoft.UI.Dispatching;
using Microsoft.UI.Xaml.Controls;
using Windows.Devices.Sensors;
namespace DevicesDemo.Pages
{
public sealed partial class SimpleOrientationPage : Page
{
private SimpleOrientationSensor? simpleOrientationSensor;
public SimpleOrientationPage()
{
InitializeComponent();
// Get the default simple orientation sensor object.
simpleOrientationSensor = SimpleOrientationSensor.GetDefault();
// Assign an event handler.
if (simpleOrientationSensor != null)
{
// Assign an event handler for the reading-changed event.
simpleOrientationSensor.OrientationChanged
+= SimpleOrientationSensor_OrientationChanged;
}
else
{
statusBar.Message = "No simple orientation sensor was found.";
statusBar.Severity = InfoBarSeverity.Error;
statusBar.IsOpen = true;
}
}
// This event handler writes the current simple orientation
// reading to the text block on the XAML page.
private void SimpleOrientationSensor_OrientationChanged(SimpleOrientationSensor sender,
SimpleOrientationSensorOrientationChangedEventArgs args)
{
DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
switch (args.Orientation)
{
case SimpleOrientation.NotRotated:
txtOrientation.Text = "Not Rotated";
break;
case SimpleOrientation.Rotated90DegreesCounterclockwise:
txtOrientation.Text = "Rotated 90 Degrees Counterclockwise";
break;
case SimpleOrientation.Rotated180DegreesCounterclockwise:
txtOrientation.Text = "Rotated 180 Degrees Counterclockwise";
break;
case SimpleOrientation.Rotated270DegreesCounterclockwise:
txtOrientation.Text = "Rotated 270 Degrees Counterclockwise";
break;
case SimpleOrientation.Faceup:
txtOrientation.Text = "Faceup";
break;
case SimpleOrientation.Facedown:
txtOrientation.Text = "Facedown";
break;
default:
txtOrientation.Text = "Unknown orientation";
break;
}
});
}
}
}
<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"/>
</Grid.RowDefinitions>
<TextBlock Text="Orientation:" Style="{StaticResource LabelTextBlockStyle}"/>
<TextBlock x:Name="txtOrientation" Grid.Column="1" Text="---"/>
</Grid>
<InfoBar x:Name="statusBar" Grid.Row="1"/>
</Grid>
Wenn die App ausgeführt wird, können Sie die Ausrichtungswerte ändern, indem Sie das Gerät verschieben.
Im vorherigen Beispiel wird der wesentliche Code veranschaulicht, den Sie schreiben müssen, um einfache Ausrichtungssensoreingaben in Ihre App zu integrieren.
Verbinden mit dem einfachen Ausrichtungssensor
Rufen Sie die GetDefault-Methode auf, um eine Verbindung mit dem Standardausrichtungssensor herzustellen.
private SimpleOrientationSensor? simpleOrientationSensor;
// ...
simpleOrientationSensor = SimpleOrientationSensor.GetDefault();
Sie können auch FromIdAsync aufrufen, um einSimpleOrientationSensorobjekt aus einem DeviceInformation.Idwert zu erstellen. Weitere Informationen finden Sie unter "Aufzählen von Geräten".
Wenn kein einfacher Ausrichtungssensor erkannt wird, wird die Statusmeldung aktualisiert, um den Benutzer zu informieren.
Daten des einfachen Orientierungssensors auslesen
Die neuen Daten des einfachen Ausrichtungssensors werden im OrientationChanged-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 den Textblock geschrieben, der im XAML-Code für die entsprechende Seite enthalten ist.
simpleOrientationSensor.OrientationChanged
+= SimpleOrientationSensor_OrientationChanged;
// ...
private void SimpleOrientationSensor_OrientationChanged(SimpleOrientationSensor sender,
SimpleOrientationSensorOrientationChangedEventArgs args)
{
DispatcherQueue.TryEnqueue(DispatcherQueuePriority.Normal, () =>
{
switch (args.Orientation)
{
case SimpleOrientation.NotRotated:
txtOrientation.Text = "Not Rotated";
break;
case SimpleOrientation.Rotated90DegreesCounterclockwise:
txtOrientation.Text = "Rotated 90 Degrees Counterclockwise";
break;
case SimpleOrientation.Rotated180DegreesCounterclockwise:
txtOrientation.Text = "Rotated 180 Degrees Counterclockwise";
break;
case SimpleOrientation.Rotated270DegreesCounterclockwise:
txtOrientation.Text = "Rotated 270 Degrees Counterclockwise";
break;
case SimpleOrientation.Faceup:
txtOrientation.Text = "Faceup";
break;
case SimpleOrientation.Facedown:
txtOrientation.Text = "Facedown";
break;
default:
txtOrientation.Text = "Unknown orientation";
break;
}
});
}
Als Alternative zum OrientationChanged Ereignis können Sie ein einmaliges Lesen der aktuellen Ausrichtung verwenden, indem Sie die GetCurrentOrientation-Methode aufrufen.
Zugehörige Themen
Windows developer