Condividi tramite


Xamarin.Essentials: OrientationSensor

La classe OrientationSensor consente di monitorare l'orientamento di un dispositivo in uno spazio tridimensionale.

Nota

Questa classe è progettata per determinare l'orientamento di un dispositivo nello spazio 3D. Se è necessario determinare se lo schermo del dispositivo è in modalità verticale o orizzontale, usare la proprietà Orientation dell'oggetto ScreenMetrics disponibile dalla classe DeviceDisplay.

Operazioni preliminari

Per iniziare a usare questa API, leggere la guida introduttiva per Xamarin.Essentials assicurarsi che la libreria sia installata e configurata correttamente nei progetti.

Uso di OrientationSensor

Aggiungere un riferimento a Xamarin.Essentials nella classe :

using Xamarin.Essentials;

OrientationSensor viene abilitato tramite la chiamata del metodo Start per monitorare le variazioni dell'orientamento del dispositivo e disabilitato chiamando il metodo Stop. Le eventuali modifiche vengono inviate tramite l'evento ReadingChanged. Ecco un esempio di utilizzo:


public class OrientationSensorTest
{
    // Set speed delay for monitoring changes.
    SensorSpeed speed = SensorSpeed.UI;

    public OrientationSensorTest()
    {
        // Register for reading changes, be sure to unsubscribe when finished
        OrientationSensor.ReadingChanged += OrientationSensor_ReadingChanged;
    }

    void OrientationSensor_ReadingChanged(object sender, OrientationSensorChangedEventArgs e)
    {
        var data = e.Reading;
        Console.WriteLine($"Reading: X: {data.Orientation.X}, Y: {data.Orientation.Y}, Z: {data.Orientation.Z}, W: {data.Orientation.W}");
        // Process Orientation quaternion (X, Y, Z, and W)
    }

    public void ToggleOrientationSensor()
    {
        try
        {
            if (OrientationSensor.IsMonitoring)
                OrientationSensor.Stop();
            else
                OrientationSensor.Start(speed);
        }
        catch (FeatureNotSupportedException fnsEx)
        {
            // Feature not supported on device
        }
        catch (Exception ex)
        {
            // Other error has occurred.
        }
    }
}

Le letture di OrientationSensor vengono restituite in forma di Quaternion che descrive l'orientamento del dispositivo in base a due sistemi di coordinate 3D:

Il dispositivo (in genere un telefono o tablet) usa un sistema di coordinate 3D con gli assi seguenti:

  • L'asse X positivo punta a destra dello schermo in modalità verticale.
  • L'asse Y positivo punta alla parte superiore del dispositivo in modalità verticale.
  • L'asse Z punta all'esterno dello schermo.

Il sistema di coordinate 3D della terra usa gli assi seguenti:

  • L'asse X positivo è tangenziale rispetto alla superficie della terra e punta a est.
  • Anche l'asse Y positivo è tangenziale rispetto alla superficie della terra e punta a nord.
  • L'asse Z positivo è perpendicolare alla superficie della terra e punta verso l'alto.

Quaternion descrive la rotazione del sistema di coordinate del dispositivo rispetto al sistema di coordinate della terra.

Un valore Quaternion è strettamente correlato alla rotazione attorno a un asse. Se un asse di rotazione è il vettore normalizzato (ax, ay, az), e l'angolo di rotazione è Θ, i componenti (X, Y, Z, W) del quaternione sono:

(ax·sin(Θ/2), ay·sin(Θ/2), az·sin(Θ/2), cos(Θ/2))

Questi sono i sistemi di coordinate di destra, quindi con il pollice della mano destra puntato nella direzione positiva dell'asse di rotazione, la curva delle dita indica la direzione di rotazione per gli angoli positivi.

Esempi:

  • Quando il dispositivo è appoggiato su un piano con lo schermo rivolto verso l'alto, con la parte superiore del dispositivo (in modalità verticale) orientata a nord, i due sistemi di coordinate sono allineati. Il valore Quaternion rappresenta il quaternione identità (0, 0, 0, 1). Tutte le rotazioni possono essere analizzate rispetto a questa posizione.

  • Quando il dispositivo è appoggiato su un piano con lo schermo rivolto verso l'alto e la parte superiore del dispositivo (in modalità verticale) è orientata a ovest, il valore di Quaternion è (0, 0, 0.707, 0.707). Il dispositivo è stato ruotato di 90 gradi attorno all'asse Z della terra.

  • Quando il dispositivo viene mantenuto in verticale in modo che la parte superiore (in modalità verticale) punti verso il cielo e la parte posteriore del dispositivo sia rivolta verso nord, il dispositivo è stato ruotato di 90 gradi attorno all'asse X. Il valore di Quaternion è (0.707, 0, 0, 0.707).

  • Se il dispositivo è posizionato in modo che il bordo sinistro si trova su una tabella e i primi punti a nord, il dispositivo è stato ruotato -90 gradi intorno all'asse Y (o 90 gradi intorno all'asse Y negativo). Il valore di Quaternion è (0, -0.707, 0, 0.707).

Velocità del sensore

  • Fastest - Ottenere i dati del sensore il più velocemente possibile (non è garantita la restituzione sul thread dell'interfaccia utente).
  • Game - Velocità adatta ai giochi (non è garantita la restituzione sul thread dell'interfaccia utente).
  • Impostazione predefinita: frequenza predefinita adatta alle modifiche dell'orientamento dello schermo.
  • UI - Velocità adatta per l'interfaccia utente generale.

Se non è garantito che il gestore eventi venga eseguito sul thread dell'interfaccia utente e se il gestore eventi deve accedere a elementi dell'interfaccia utente, usare il metodo MainThread.BeginInvokeOnMainThread per eseguire il codice sul thread dell'interfaccia utente.

API