Freigeben über


Verwenden des Ausrichtungssensors

Erfahren Sie, wie Sie die Ausrichtungssensoren verwenden, um die Geräteausrichtung zu bestimmen.

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 einen Ausrichtungssensor unterstützen.

Erstellen einer OrientationSensor-App

Ein Ausrichtungssensor ist eine der verschiedenen Arten von Umgebungssensoren, mit denen Apps auf Änderungen der Geräteausrichtung reagieren können.

Es gibt zwei verschiedene Arten von Ausrichtungssensor-APIs, die im Windows.Devices.Sensors-Namespace 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, die zwei eine Quaternion und eine Drehungsmatrix 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 SimpleOrientation-API wird verwendet, um die aktuelle Geräteausrichtung in Bezug auf Definitionen wie Hochformat, Hochformat, Querformat links und Querformat rechts zu bestimmen. Es kann auch erkennen, ob ein Gerät face-up oder face-down ist. Anstatt Eigenschaften wie "Hochformat" oder "Querformat links" zurückzugeben, gibt dieser Sensor einen Drehungswert zurück: "Nicht gedreht", "Rotated90DegreesCounterclockwise" usw. Die folgende Tabelle ordnet allgemeine Ausrichtungseigenschaften dem entsprechenden Sensorlesewert zu.

Ausrichtung Entsprechende Sensorlesewerte
Hochformat NotRotated
Querformat links Rotated90DegreesCounterclockwise
Hochformat nach unten Gedreht180DegreesCounterclockwise
Querformat rechts Rotated270DegreesCounterclockwise

Hinweis

Eine umfassendere Implementierung finden Sie unter:

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;
    using Windows.Devices.Sensors;

    // The Blank Page item template is documented at https://go.microsoft.com/fwlink/p/?linkid=234238

    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 OrientationSensor _sensor;

            private async void ReadingChanged(object sender, OrientationSensorReadingChangedEventArgs e)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    OrientationSensorReading reading = e.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);
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
                _sensor = OrientationSensor.GetDefault();

                // Establish the report interval for all scenarios
                uint minReportInterval = _sensor.MinimumReportInterval;
                uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
                _sensor.ReportInterval = reportInterval;

                // Establish event handler
                _sensor.ReadingChanged += new TypedEventHandler<OrientationSensor, OrientationSensorReadingChangedEventArgs>(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 OrientationSensorCS erstellt haben, ersetzen Sie es durch namespace OrientationSensorCSnamespace 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="Black">
            <TextBlock HorizontalAlignment="Left" Height="28" Margin="4,4,0,0" TextWrapping="Wrap" Text="M11:" VerticalAlignment="Top" Width="46"/>
            <TextBlock HorizontalAlignment="Left" Height="23" Margin="4,36,0,0" TextWrapping="Wrap" Text="M12:" VerticalAlignment="Top" Width="39"/>
            <TextBlock HorizontalAlignment="Left" Height="24" Margin="4,72,0,0" TextWrapping="Wrap" Text="M13:" VerticalAlignment="Top" Width="39"/>
            <TextBlock HorizontalAlignment="Left" Height="31" Margin="4,118,0,0" TextWrapping="Wrap" Text="M21:" VerticalAlignment="Top" Width="39"/>
            <TextBlock HorizontalAlignment="Left" Height="24" Margin="4,160,0,0" TextWrapping="Wrap" Text="M22:" VerticalAlignment="Top" Width="39"/>
            <TextBlock HorizontalAlignment="Left" Height="24" Margin="8,201,0,0" TextWrapping="Wrap" Text="M23:" VerticalAlignment="Top" Width="35"/>
            <TextBlock HorizontalAlignment="Left" Height="23" Margin="4,234,0,0" TextWrapping="Wrap" Text="M31:" VerticalAlignment="Top" Width="39"/>
            <TextBlock HorizontalAlignment="Left" Height="28" Margin="4,274,0,0" TextWrapping="Wrap" Text="M32:" VerticalAlignment="Top" Width="46"/>
            <TextBlock HorizontalAlignment="Left" Height="21" Margin="4,322,0,0" TextWrapping="Wrap" Text="M33:" VerticalAlignment="Top" Width="39"/>
            <TextBlock x:Name="txtM11" HorizontalAlignment="Left" Height="19" Margin="43,4,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM12" HorizontalAlignment="Left" Height="23" Margin="43,36,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM13" HorizontalAlignment="Left" Height="15" Margin="43,72,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM21" HorizontalAlignment="Left" Height="20" Margin="43,114,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM22" HorizontalAlignment="Left" Height="19" Margin="43,156,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM23" HorizontalAlignment="Left" Height="16" Margin="43,197,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM31" HorizontalAlignment="Left" Height="17" Margin="43,230,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM32" HorizontalAlignment="Left" Height="19" Margin="43,270,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock x:Name="txtM33" HorizontalAlignment="Left" Height="21" Margin="43,322,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="53"/>
            <TextBlock HorizontalAlignment="Left" Height="15" Margin="194,8,0,0" TextWrapping="Wrap" Text="Quaternion X:" VerticalAlignment="Top" Width="81"/>
            <TextBlock HorizontalAlignment="Left" Height="23" Margin="194,36,0,0" TextWrapping="Wrap" Text="Quaternion Y:" VerticalAlignment="Top" Width="81"/>
            <TextBlock HorizontalAlignment="Left" Height="15" Margin="194,72,0,0" TextWrapping="Wrap" Text="Quaternion Z:" VerticalAlignment="Top" Width="81"/>
            <TextBlock x:Name="txtQuaternionX" HorizontalAlignment="Left" Height="15" Margin="279,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="104"/>
            <TextBlock x:Name="txtQuaternionY" HorizontalAlignment="Left" Height="12" Margin="275,36,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="108"/>
            <TextBlock x:Name="txtQuaternionZ" HorizontalAlignment="Left" Height="19" Margin="275,68,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="89"/>
            <TextBlock HorizontalAlignment="Left" Height="21" Margin="194,96,0,0" TextWrapping="Wrap" Text="Quaternion W:" VerticalAlignment="Top" Width="81"/>
            <TextBlock x:Name="txtQuaternionW" HorizontalAlignment="Left" Height="12" Margin="279,96,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="72"/>

        </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 OrientationSensorCS erstellt haben, ersetzen Sie es durch x:Class="OrientationSensorCS.MainPage"x:Class="App1.MainPage" . Sie sollten auch durch xmlns:local="using:App1" xmlns:local="using:OrientationSensorCS".

  • 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 Ausrichtung ä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 Ausrichtungssensoreingaben in Ihre App zu integrieren.

Die App stellt eine Verbindung mit dem Standardausrichtungssensor in der MainPage-Methode her.

_sensor = OrientationSensor.GetDefault();

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 = _sensor.MinimumReportInterval;
uint reportInterval = minReportInterval > 16 ? minReportInterval : 16;
_sensor.ReportInterval = reportInterval;

Die neuen Sensordaten 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.

_sensor.ReadingChanged += new TypedEventHandler<OrientationSensor,
OrientationSensorReadingChangedEventArgs>(ReadingChanged);

Diese neuen Werte werden in die TextBlocks geschrieben, die im XAML-Code des Projekts enthalten sind.

Erstellen einer SimpleOrientation-App

Dieser Abschnitt ist in zwei Unterabschnitte unterteilt. Der erste Unterabschnitt führt Sie durch die Schritte, die zum Erstellen einer einfachen Ausrichtungsanwendung erforderlich sind. Im folgenden Unterabschnitt wird die soeben erstellte App erläutert.

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;
    using Windows.Devices.Sensors;
    // The Blank Page item template is documented at https://go.microsoft.com/fwlink/p/?linkid=234238

    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
        {
            // Sensor and dispatcher variables
            private SimpleOrientationSensor _simpleorientation;

            // This event handler writes the current sensor reading to
            // a text block on the app' s main page.

            private async void OrientationChanged(object sender, SimpleOrientationSensorOrientationChangedEventArgs e)
            {
                await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
                {
                    SimpleOrientation orientation = e.Orientation;
                    switch (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;
                    }
                });
            }

            public MainPage()
            {
                this.InitializeComponent();
                _simpleorientation = SimpleOrientationSensor.GetDefault();

                // Assign an event handler for the sensor orientation-changed event
                if (_simpleorientation != null)
                {
                    _simpleorientation.OrientationChanged += new TypedEventHandler<SimpleOrientationSensor, SimpleOrientationSensorOrientationChangedEventArgs>(OrientationChanged);
                }
            }
        }
    }

Sie müssen den Namespace im vorherigen Codeausschnitt mit dem Namen umbenennen, den Sie ihrem Projekt gegeben haben. Wenn Sie beispielsweise ein Projekt namens SimpleOrientationCS erstellt haben, ersetzen namespace App1 Sie es durch namespace SimpleOrientationCS.

  • Ö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="24" Margin="8,8,0,0" TextWrapping="Wrap" Text="Current Orientation:" VerticalAlignment="Top" Width="101" Foreground="#FFF8F7F7"/>
            <TextBlock x:Name="txtOrientation" HorizontalAlignment="Left" Height="24" Margin="118,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="175" Foreground="#FFFEFAFA"/>

        </Grid>
    </Page>

Sie müssen den ersten Teil des Klassennamens im vorherigen Codeausschnitt durch den Namespace Ihrer App ersetzen. Wenn Sie beispielsweise ein Projekt namens SimpleOrientationCS erstellt haben, ersetzen x:Class="App1.MainPage" Sie es durch x:Class="SimpleOrientationCS.MainPage". Sie sollten auch durch xmlns:local="using:App1" xmlns:local="using:SimpleOrientationCS".

  • 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 Ausrichtung ä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 die Eingabe eines einfachen Ausrichtungssensors in Ihre App zu integrieren.

Die App stellt eine Verbindung mit dem Standardsensor in der MainPage-Methode her.

_simpleorientation = SimpleOrientationSensor.GetDefault();

Die neuen Sensordaten werden in der OrientationChanged-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.

_simpleorientation.OrientationChanged += new TypedEventHandler<SimpleOrientationSensor,
SimpleOrientationSensorOrientationChangedEventArgs>(OrientationChanged);

Diese neuen Werte werden in einen TextBlock geschrieben, der im XAML-Code des Projekts enthalten ist.

<TextBlock HorizontalAlignment="Left" Height="24" Margin="8,8,0,0" TextWrapping="Wrap" Text="Current Orientation:" VerticalAlignment="Top" Width="101" Foreground="#FFF8F7F7"/>
 <TextBlock x:Name="txtOrientation" HorizontalAlignment="Left" Height="24" Margin="118,8,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top" Width="175" Foreground="#FFFEFAFA"/>