Udostępnij za pośrednictwem


Uzyskiwanie dostępu do czujników urządzeń

Browse sample. Przeglądanie przykładu

Urządzenia mają różnego rodzaju czujniki, które są dostępne dla Ciebie. Niektóre czujniki mogą wykrywać ruch, inne zmiany w środowisku, takie jak światło. Monitorowanie i reagowanie na te czujniki sprawia, że aplikacja jest dynamiczna w dostosowywaniu się do sposobu użycia urządzenia. Możesz również reagować na zmiany w czujnikach i powiadamiać użytkownika. Ten artykuł zawiera krótkie omówienie typowych czujników obsługiwanych przez interfejs użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI).

Typy związane z czujnikiem urządzenia są dostępne w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Szybkość czujnika

Szybkość czujnika określa szybkość, z jaką czujnik zwróci dane do aplikacji. Po uruchomieniu czujnika należy podać żądaną szybkość czujnika z wyliczeniem SensorSpeed :

  • Fastest
    Pobierz dane czujnika tak szybko, jak to możliwe (nie ma gwarancji powrotu do wątku interfejsu użytkownika).

  • Game
    Stawka odpowiednia dla gier (nie ma gwarancji powrotu w wątku interfejsu użytkownika).

  • UI
    Oceń odpowiednią dla ogólnego interfejsu użytkownika.

  • Default
    Częstotliwość domyślna odpowiednia dla zmian orientacji ekranu.

Ostrzeżenie

Monitorowanie zbyt wielu czujników jednocześnie może mieć wpływ na dane czujnika szybkości zwracane do aplikacji.

W programie .NET 8 SensorSpeed interwały są identyczne na wszystkich platformach:

  • Default używa interwału 200 ms.
  • UI używa interwału 60 ms.
  • Game używa interwału 20 ms.
  • Fastest używa interwału 5 ms.

Programy obsługi zdarzeń czujnika

Programy obsługi zdarzeń dodane do czujników z szybkością Gamelub Fastest nie są gwarantowane do uruchomienia w wątku interfejsu użytkownika. Jeśli program obsługi zdarzeń musi uzyskać dostęp do elementów interfejsu użytkownika, użyj MainThread.BeginInvokeOnMainThread metody , aby uruchomić ten kod w wątku interfejsu użytkownika.

Akcelerometr

Czujnik akcelerometru mierzy przyspieszenie urządzenia wzdłuż trzech osi. Dane zgłaszane przez czujnik reprezentują sposób przenoszenia urządzenia przez użytkownika.

Interfejs IAccelerometer zapewnia dostęp do czujnika i jest dostępny za pośrednictwem Accelerometer.Default właściwości . Zarówno interfejs, jak IAccelerometer i Accelerometer klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Rozpocznij

Aby uzyskać dostęp do funkcji akcelerometru, może być wymagana następująca konfiguracja specyficzna dla platformy:

Jeśli aplikacja jest przeznaczona dla systemu Android 12+ (INTERFEJS API 31+), system nakłada limit 200 Hz na częstotliwość odświeżania danych z tego czujnika. Jeśli aplikacja musi zbierać dane czujnika przy użyciu Fastest szybkości czujnika HIGH_SAMPLING_RATE_SENSORS , musisz zadeklarować uprawnienie. Uprawnienie można skonfigurować na następujące sposoby:

  • Dodaj uprawnienie oparte na zestawie:

    Otwórz plik Platforms/Android/MainApplication.cs i dodaj następujący atrybut zestawu po using dyrektywach:

    [assembly: UsesPermission(Android.Manifest.Permission.HighSamplingRateSensors)]
    

    - lub -

  • Zaktualizuj manifest systemu Android:

    Otwórz plik Platforms/Android/AndroidManifest.xml i dodaj następujący wiersz w węźlemanifest:

    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
    

    - lub -

  • Zaktualizuj manifest systemu Android w edytorze manifestu:

    W programie Visual Studio kliknij dwukrotnie plik Platforms/Android/AndroidManifest.xml , aby otworzyć edytor manifestu systemu Android. Następnie w obszarze Wymagane uprawnienia sprawdź uprawnienia HIGH_SAMPLING_RATE_SENSORS . Spowoduje to automatyczne zaktualizowanie pliku AndroidManifest.xml .

Uwaga

Jeśli użytkownik wyłączy dostęp do mikrofonu przy użyciu włączeń urządzenia, czujniki ruchu i położenia są zawsze ograniczone szybkością, niezależnie od tego, czy deklarujesz HIGH_SAMPLING_RATE_SENSORS uprawnienie.

Monitorowanie czujnika akcelerometru

Aby rozpocząć monitorowanie czujnika akcelerometru, wywołaj metodę IAccelerometer.Start . Program .NET MAUI wysyła zmiany danych akcelerometru do aplikacji przez podniesienie IAccelerometer.ReadingChanged zdarzenia. Użyj metody , IAccelerometer.Stop aby zatrzymać monitorowanie czujnika. Możesz wykryć stan monitorowania akcelerometru z właściwością IAccelerometer.IsMonitoring , która będzie miała true miejsce, jeśli akcelerometr został uruchomiony i jest obecnie monitorowany.

W poniższym przykładzie kodu pokazano monitorowanie akcelerometru pod kątem zmian:

public void ToggleAccelerometer()
{
    if (Accelerometer.Default.IsSupported)
    {
        if (!Accelerometer.Default.IsMonitoring)
        {
            // Turn on accelerometer
            Accelerometer.Default.ReadingChanged += Accelerometer_ReadingChanged;
            Accelerometer.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off accelerometer
            Accelerometer.Default.Stop();
            Accelerometer.Default.ReadingChanged -= Accelerometer_ReadingChanged;
        }
    }    
}

private void Accelerometer_ReadingChanged(object sender, AccelerometerChangedEventArgs e)
{
    // Update UI Label with accelerometer state
    AccelLabel.TextColor = Colors.Green;
    AccelLabel.Text = $"Accel: {e.Reading}";
}

Odczyty akcelerometru są zgłaszane z powrotem w G. G jest jednostką siły grawitacyjnej równej grawitacji wywieranej przez pole grawitacyjne ziemi $(9,81 m/s^2)$.

Układ współrzędnych jest zdefiniowany względem ekranu urządzenia w domyślnej orientacji. Osie nie są zamieniane, gdy zmienia się orientacja ekranu urządzenia.

X jest pozioma i wskazuje po prawej stronie, oś Y jest pionowa i wskazuje w górę, a oś Z wskazuje na zewnątrz przedniej powierzchni ekranu. W tym systemie współrzędne za ekranem mają ujemne wartości Z .

Przykłady:

  • Gdy urządzenie leży płasko na tabeli i jest wypychane po lewej stronie w kierunku prawej, wartość przyspieszenia X jest dodatnia.

  • Gdy urządzenie znajduje się płasko w tabeli, wartość przyspieszenia wynosi +1,00 G lub $(+9,81 m/s^2)$, co odpowiada przyspieszaniu urządzenia $(0 m/s^2)$ minus siła grawitacji $(-9,81 m/s^2)$ i znormalizowana tak jak w G.

  • Gdy urządzenie znajduje się płasko na tabeli i jest wypychane w kierunku nieba z przyspieszeniem A $m/s^2$, wartość przyspieszenia jest równa $A+9,81$ co odpowiada przyspieszaniu urządzenia $(+A m/s^2)$ minus siła grawitacji $(-9,81 m/s^2)$ i znormalizowana w G.

Informacje specyficzne dla platformy (Akcelerometer)

Nie ma żadnych informacji specyficznych dla platformy związanych z czujnikiem akcelerometru.

Barometr

Czujnik barometru mierzy ciśnienie powietrza otoczenia. Dane zgłaszane przez czujnik reprezentują bieżące ciśnienie powietrza. Te dane są zgłaszane po raz pierwszy podczas monitorowania czujnika, a następnie za każdym razem, gdy zmienia się ciśnienie.

Interfejs IBarometer zapewnia dostęp do czujnika i jest dostępny za pośrednictwem Barometer.Default właściwości . Zarówno interfejs, jak IBarometer i Barometer klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Aby rozpocząć monitorowanie czujnika barometru, wywołaj metodę IBarometer.Start . Program .NET MAUI wysyła odczyty ciśnienia powietrza do aplikacji przez podniesienie IBarometer.ReadingChanged zdarzenia. Użyj metody , IBarometer.Stop aby zatrzymać monitorowanie czujnika. Możesz wykryć stan monitorowania barometru IBarometer.IsMonitoring za pomocą właściwości , która będzie, true jeśli barometr jest obecnie monitorowany.

Odczyt ciśnienia jest reprezentowany w hektopascalach.

W poniższym przykładzie kodu pokazano monitorowanie barometru pod kątem zmian:

public void ToggleBarometer()
{
    if (Barometer.Default.IsSupported)
    {
        if (!Barometer.Default.IsMonitoring)
        {
            // Turn on barometer
            Barometer.Default.ReadingChanged += Barometer_ReadingChanged;
            Barometer.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off barometer
            Barometer.Default.Stop();
            Barometer.Default.ReadingChanged -= Barometer_ReadingChanged;
        }
    }
}

private void Barometer_ReadingChanged(object sender, BarometerChangedEventArgs e)
{
    // Update UI Label with barometer state
    BarometerLabel.TextColor = Colors.Green;
    BarometerLabel.Text = $"Barometer: {e.Reading}";
}

Informacje specyficzne dla platformy (Barometr)

W tej sekcji opisano szczegóły implementacji specyficzne dla platformy związane z czujnikiem barometru.

Brak szczegółów implementacji specyficznych dla platformy.

Kompas

Czujnik kompasu monitoruje magnetyczny nagłówek na północ urządzenia.

Interfejs ICompass zapewnia dostęp do czujnika i jest dostępny za pośrednictwem Compass.Default właściwości . Zarówno interfejs, jak ICompass i Compass klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Aby rozpocząć monitorowanie czujnika kompasu, wywołaj metodę ICompass.Start . Program .NET MAUI zgłasza ICompass.ReadingChanged zdarzenie po zmianie nagłówka kompasu. Użyj metody , ICompass.Stop aby zatrzymać monitorowanie czujnika. Można wykryć stan monitorowania kompasu ICompass.IsMonitoring z właściwością, która będzie, true jeśli kompas jest obecnie monitorowany.

W poniższym przykładzie kodu pokazano monitorowanie kompasu pod kątem zmian:

private void ToggleCompass()
{
    if (Compass.Default.IsSupported)
    {
        if (!Compass.Default.IsMonitoring)
        {
            // Turn on compass
            Compass.Default.ReadingChanged += Compass_ReadingChanged;
            Compass.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off compass
            Compass.Default.Stop();
            Compass.Default.ReadingChanged -= Compass_ReadingChanged;
        }
    }
}

private void Compass_ReadingChanged(object sender, CompassChangedEventArgs e)
{
    // Update UI Label with compass state
    CompassLabel.TextColor = Colors.Green;
    CompassLabel.Text = $"Compass: {e.Reading}";
}

Informacje specyficzne dla platformy (Compass)

W tej sekcji opisano szczegóły implementacji specyficzne dla platformy związane z funkcją kompasu.

System Android nie udostępnia interfejsu API do pobierania nagłówka kompasu. Program .NET MAUI używa czujników akcelerometru i magnetometru do obliczania magnetycznego nagłówka północy, który jest zalecany przez Firmę Google.

W rzadkich przypadkach można zobaczyć niespójne wyniki, ponieważ czujniki muszą być skalibrowane. Odtwarzanie kompasu w systemie Android różni się w zależności od modelu telefonu i wersji systemu Android. Musisz przeszukać Internet, aby dowiedzieć się, jak odzyskać kompas. Oto dwa linki, które mogą pomóc w odzyskiwaleniu kompasu:

Uruchomienie wielu czujników z aplikacji w tym samym czasie może pogorszyć szybkość czujnika.

Filtr Lowpass

Ze względu na sposób aktualizowania i obliczania wartości kompasu systemu Android może być konieczne złagodzenie wartości. Filtr Lowpass można zastosować, aby uśredniać sinus i cosinus wartości kątów i można je włączyć przy użyciu Start przeciążenia metody, które akceptuje bool applyLowPassFilter parametr:

Compass.Default.Start(SensorSpeed.UI, applyLowPassFilter: true);

Jest to stosowane tylko na platformie Android, a parametr jest ignorowany w systemach iOS i Windows. Aby uzyskać więcej informacji, zobacz ten komentarz dotyczący problemu w usłudze GitHub.

Potrząsnąć

Mimo że ten artykuł zawiera listę wstrząsnąć jako czujnik, to nie jest. Akcelerometr służy do wykrywania, kiedy urządzenie jest wstrząśnięte.

Interfejs IAccelerometer zapewnia dostęp do czujnika i jest dostępny za pośrednictwem Accelerometer.Default właściwości . Zarówno interfejs, jak IAccelerometer i Accelerometer klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Uwaga

Jeśli aplikacja musi zebrać dane czujnika akcelerometru przy użyciu Fastest prędkości czujnika HIGH_SAMPLING_RATE_SENSORS , musisz zadeklarować uprawnienie. Aby uzyskać więcej informacji, zobacz Akcelerometer.

Interfejs API wykrywania wstrząsu używa nieprzetworzonych odczytów z akcelerometru do obliczania przyspieszenia. Używa prostego mechanizmu kolejki do wykrywania, czy 3/4. części ostatnich zdarzeń akcelerometru miały miejsce w ciągu ostatniej połowy sekundy. Przyspieszenie jest obliczane przez dodanie kwadratu X, Y i Z ($x^2+y^2+z^2$) odczytów z akcelerometru i porównania go z określonym progiem.

Aby rozpocząć monitorowanie czujnika akcelerometru, wywołaj metodę IAccelerometer.Start . Po wykryciu wstrząsu IAccelerometer.ShakeDetected zdarzenie jest zgłaszane. Użyj metody , IAccelerometer.Stop aby zatrzymać monitorowanie czujnika. Możesz wykryć stan monitorowania akcelerometru z właściwością IAccelerometer.IsMonitoring , która będzie miała true miejsce, jeśli akcelerometr został uruchomiony i jest obecnie monitorowany.

Zaleca się użycie polecenia lub szybszego w Game przypadku elementu SensorSpeed.

W poniższym przykładzie kodu pokazano monitorowanie akcelerometru ShakeDetected dla zdarzenia:

private void ToggleShake()
{
    if (Accelerometer.Default.IsSupported)
    {
        if (!Accelerometer.Default.IsMonitoring)
        {
            // Turn on accelerometer
            Accelerometer.Default.ShakeDetected += Accelerometer_ShakeDetected;
            Accelerometer.Default.Start(SensorSpeed.Game);
        }
        else
        {
            // Turn off accelerometer
            Accelerometer.Default.Stop();
            Accelerometer.Default.ShakeDetected -= Accelerometer_ShakeDetected;
        }
    }
}

private void Accelerometer_ShakeDetected(object sender, EventArgs e)
{
    // Update UI Label with a "shaked detected" notice, in a randomized color
    ShakeLabel.TextColor = new Color(Random.Shared.Next(256), Random.Shared.Next(256), Random.Shared.Next(256));
    ShakeLabel.Text = $"Shake detected";
}

Informacje specyficzne dla platformy (shake)

Nie ma żadnych informacji specyficznych dla platformy związanych z czujnikiem akcelerometru.

Żyroskop

Czujnik żyroskopu mierzy prędkość obrotu kątowego wokół trzech głównych osi urządzenia.

Interfejs IGyroscope zapewnia dostęp do czujnika i jest dostępny za pośrednictwem Gyroscope.Default właściwości . Zarówno interfejs, jak IGyroscope i Gyroscope klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Rozpocznij

Aby uzyskać dostęp do funkcji żyroskopu, może być wymagana następująca konfiguracja specyficzna dla platformy:

Jeśli aplikacja jest przeznaczona dla systemu Android 12+ (INTERFEJS API 31+), system nakłada limit 200 Hz na częstotliwość odświeżania danych z tego czujnika. Jeśli aplikacja musi zbierać dane czujnika przy użyciu Fastest szybkości czujnika HIGH_SAMPLING_RATE_SENSORS , musisz zadeklarować uprawnienie. Uprawnienie można skonfigurować na następujące sposoby:

  • Dodaj uprawnienie oparte na zestawie:

    Otwórz plik Platforms/Android/MainApplication.cs i dodaj następujący atrybut zestawu po using dyrektywach:

    [assembly: UsesPermission(Android.Manifest.Permission.HighSamplingRateSensors)]
    

    - lub -

  • Zaktualizuj manifest systemu Android:

    Otwórz plik Platforms/Android/AndroidManifest.xml i dodaj następujący wiersz w węźlemanifest:

    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
    

    - lub -

  • Zaktualizuj manifest systemu Android w edytorze manifestu:

    W programie Visual Studio kliknij dwukrotnie plik Platforms/Android/AndroidManifest.xml , aby otworzyć edytor manifestu systemu Android. Następnie w obszarze Wymagane uprawnienia sprawdź uprawnienia HIGH_SAMPLING_RATE_SENSORS . Spowoduje to automatyczne zaktualizowanie pliku AndroidManifest.xml .

Uwaga

Jeśli użytkownik wyłączy dostęp do mikrofonu przy użyciu włączeń urządzenia, czujniki ruchu i położenia są zawsze ograniczone szybkością, niezależnie od tego, czy deklarujesz HIGH_SAMPLING_RATE_SENSORS uprawnienie.

Monitorowanie czujnika żyroskopu

Aby rozpocząć monitorowanie czujnika żyroskopu, wywołaj metodę IGyroscope.Start . Program .NET MAUI wysyła zmiany danych żyroskopu IGyroscope.ReadingChanged do aplikacji przez podniesienie zdarzenia. Dane dostarczone przez to zdarzenie są mierzone w radia/s (radian na sekundę). Użyj metody , IGyroscope.Stop aby zatrzymać monitorowanie czujnika. Można wykryć stan monitorowania żyroskopu IGyroscope.IsMonitoring z właściwością, która będzie miała true miejsce, jeśli żyroskop został uruchomiony i jest obecnie monitorowany.

W poniższym przykładzie kodu pokazano monitorowanie żyroskopu:

private void ToggleGyroscope()
{
    if (Gyroscope.Default.IsSupported)
    {
        if (!Gyroscope.Default.IsMonitoring)
        {
            // Turn on gyroscope
            Gyroscope.Default.ReadingChanged += Gyroscope_ReadingChanged;
            Gyroscope.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off gyroscope
            Gyroscope.Default.Stop();
            Gyroscope.Default.ReadingChanged -= Gyroscope_ReadingChanged;
        }
    }
}

private void Gyroscope_ReadingChanged(object sender, GyroscopeChangedEventArgs e)
{
    // Update UI Label with gyroscope state
    GyroscopeLabel.TextColor = Colors.Green;
    GyroscopeLabel.Text = $"Gyroscope: {e.Reading}";
}

Informacje specyficzne dla platformy (Gyroscope)

Nie ma żadnych informacji specyficznych dla platformy związanych z czujnikiem żyroskopu.

Magnetometr

Czujnik magnetometru wskazuje orientację urządzenia względem pola magnetycznego Ziemi.

Interfejs IMagnetometer zapewnia dostęp do czujnika i jest dostępny za pośrednictwem Magnetometer.Default właściwości . Zarówno interfejs, jak IMagnetometer i Magnetometer klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Rozpocznij

Aby uzyskać dostęp do funkcji magnetometru, może być wymagana następująca konfiguracja specyficzna dla platformy:

Jeśli aplikacja jest przeznaczona dla systemu Android 12+ (INTERFEJS API 31+), system nakłada limit 200 Hz na częstotliwość odświeżania danych z tego czujnika. Jeśli aplikacja musi zbierać dane czujnika przy użyciu Fastest szybkości czujnika HIGH_SAMPLING_RATE_SENSORS , musisz zadeklarować uprawnienie. Uprawnienie można skonfigurować na następujące sposoby:

  • Dodaj uprawnienie oparte na zestawie:

    Otwórz plik Platforms/Android/MainApplication.cs i dodaj następujący atrybut zestawu po using dyrektywach:

    [assembly: UsesPermission(Android.Manifest.Permission.HighSamplingRateSensors)]
    

    - lub -

  • Zaktualizuj manifest systemu Android:

    Otwórz plik Platforms/Android/AndroidManifest.xml i dodaj następujący wiersz w węźlemanifest:

    <uses-permission android:name="android.permission.HIGH_SAMPLING_RATE_SENSORS" />
    

    - lub -

  • Zaktualizuj manifest systemu Android w edytorze manifestu:

    W programie Visual Studio kliknij dwukrotnie plik Platforms/Android/AndroidManifest.xml , aby otworzyć edytor manifestu systemu Android. Następnie w obszarze Wymagane uprawnienia sprawdź uprawnienia HIGH_SAMPLING_RATE_SENSORS . Spowoduje to automatyczne zaktualizowanie pliku AndroidManifest.xml .

Uwaga

Jeśli użytkownik wyłączy dostęp do mikrofonu przy użyciu włączeń urządzenia, czujniki ruchu i położenia są zawsze ograniczone szybkością, niezależnie od tego, czy deklarujesz HIGH_SAMPLING_RATE_SENSORS uprawnienie.

Monitorowanie czujnika magnetometru

Aby rozpocząć monitorowanie czujnika magnetometru, wywołaj metodę IMagnetometer.Start . Program .NET MAUI wysyła zmiany danych magnetometru do aplikacji przez podniesienie IMagnetometer.ReadingChanged zdarzenia. Dane dostarczone przez to zdarzenie są mierzone w $μT$ (mikroteslas). Użyj metody , IMagnetometer.Stop aby zatrzymać monitorowanie czujnika. Można wykryć stan monitorowania magnetometru IMagnetometer.IsMonitoring z właściwością, która będzie miała true miejsce, jeśli magnetometr został uruchomiony i jest obecnie monitorowany.

W poniższym przykładzie kodu pokazano monitorowanie magnetometru:

private void ToggleMagnetometer()
{
    if (Magnetometer.Default.IsSupported)
    {
        if (!Magnetometer.Default.IsMonitoring)
        {
            // Turn on magnetometer
            Magnetometer.Default.ReadingChanged += Magnetometer_ReadingChanged;
            Magnetometer.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off magnetometer
            Magnetometer.Default.Stop();
            Magnetometer.Default.ReadingChanged -= Magnetometer_ReadingChanged;
        }
    }
}

private void Magnetometer_ReadingChanged(object sender, MagnetometerChangedEventArgs e)
{
    // Update UI Label with magnetometer state
    MagnetometerLabel.TextColor = Colors.Green;
    MagnetometerLabel.Text = $"Magnetometer: {e.Reading}";
}

Informacje specyficzne dla platformy (Magnetometr)

Nie ma żadnych informacji specyficznych dla platformy związanych z czujnikiem magnetometru.

Orientacja

Czujnik orientacji monitoruje orientację urządzenia w przestrzeni 3D.

Uwaga

Ten czujnik nie jest używany do określania, czy ekran wideo urządzenia jest w trybie pionowym lub poziomym. DeviceDisplay.Current.MainDisplayInfo.Orientation Zamiast tego użyj właściwości . Aby uzyskać więcej informacji, zobacz Informacje o wyświetlaniu urządzenia.

Interfejs IOrientationSensor zapewnia dostęp do czujnika i jest dostępny za pośrednictwem OrientationSensor.Default właściwości . Zarówno interfejs, jak IOrientationSensor i OrientationSensor klasa są zawarte w Microsoft.Maui.Devices.Sensors przestrzeni nazw.

Aby rozpocząć monitorowanie czujnika orientacji, wywołaj metodę IOrientationSensor.Start . Program .NET MAUI wysyła zmiany danych orientacji do aplikacji przez podniesienie IOrientationSensor.ReadingChanged zdarzenia. Użyj metody , IOrientationSensor.Stop aby zatrzymać monitorowanie czujnika. Możesz wykryć stan monitorowania orientacji z właściwością IOrientationSensor.IsMonitoring , która będzie miała true miejsce, jeśli orientacja została uruchomiona i jest obecnie monitorowana.

W poniższym przykładzie kodu pokazano monitorowanie czujnika orientacji:

private void ToggleOrientation()
{
    if (OrientationSensor.Default.IsSupported)
    {
        if (!OrientationSensor.Default.IsMonitoring)
        {
            // Turn on orientation
            OrientationSensor.Default.ReadingChanged += Orientation_ReadingChanged;
            OrientationSensor.Default.Start(SensorSpeed.UI);
        }
        else
        {
            // Turn off orientation
            OrientationSensor.Default.Stop();
            OrientationSensor.Default.ReadingChanged -= Orientation_ReadingChanged;
        }
    }
}

private void Orientation_ReadingChanged(object sender, OrientationSensorChangedEventArgs e)
{
    // Update UI Label with orientation state
    OrientationLabel.TextColor = Colors.Green;
    OrientationLabel.Text = $"Orientation: {e.Reading}";
}

IOrientationSensor odczyty są zgłaszane z powrotem w postaci Quaternion elementu opisującego orientację urządzenia na podstawie dwóch układów współrzędnych 3D:

Urządzenie (zazwyczaj telefon lub tablet) ma układ współrzędnych 3D z następującymi osiami:

  • Dodatnia oś X wskazuje po prawej stronie ekranu w trybie pionowym.
  • Dodatnia oś Y wskazuje górną część urządzenia w trybie pionowym.
  • Dodatnia oś Z wskazuje na ekran.

Układ współrzędnych 3D Ziemi ma następujące osie:

  • Dodatnia oś X jest tangensem powierzchni Ziemi i punktów na wschód.
  • Dodatnia oś Y jest również tangensem na powierzchni Ziemi i punktów na północ.
  • Dodatnia oś Z jest prostopadła na powierzchnię Ziemi i wskazuje w górę.

Opis Quaternion obrotu układu współrzędnych urządzenia względem układu współrzędnych Ziemi.

Quaternion Wartość jest ściśle powiązana z rotacją wokół osi. Jeśli oś obrotu jest znormalizowanym wektorem ($a_x, a_y, a_z$), a kąt obrotu to $\theta$, wówczas składniki (X, Y, Z, W) kwaternionu to:

$(a_x \times \sin(\theta/2), a_y \times \sin(\theta/2), a_z \times \sin(\theta/2), \cos(\theta/2))$$

Są to układy współrzędnych prawej strony, więc z kciukiem prawej ręki skierowanym w kierunku dodatnim osi obrotu krzywa palców wskazuje kierunek obrotu dla kątów dodatnich.

Przykłady:

  • Gdy urządzenie znajduje się płasko na stole z ekranem skierowanym do góry urządzenia (w trybie pionowym) wskazującym na północ, dwa układy współrzędnych są wyrównane. Wartość Quaternion reprezentuje kwaternion tożsamości (0, 0, 0, 0, 1). Wszystkie rotacje można analizować względem tej pozycji.

  • Gdy urządzenie znajduje się płasko na tabeli z ekranem skierowanym w górę, a górna część urządzenia (w trybie pionowym) wskazuje na zachód, Quaternion wartość to (0, 0, 0,707, 0,707). Urządzenie zostało obrócone o 90 stopni wokół osi Z Ziemi.

  • Gdy urządzenie jest trzymane w pionie, tak aby górny (w trybie pionowym) wskazuje na niebo, a tył urządzenia stoi na północ, urządzenie zostało obrócone o 90 stopni wokół osi X. Wartość Quaternion to (0,707, 0, 0, 0,0,707).

  • Jeśli urządzenie jest ustawione tak, aby lewa krawędź znajduje się na tabeli, a górne punkty na północ, urządzenie zostało obrócone -90 stopni wokół osi Y (lub 90 stopni wokół ujemnej osi Y). Wartość Quaternion to (0, -0,707, 0, 0,707).

Informacje specyficzne dla platformy (orientacja)

Nie ma żadnych informacji specyficznych dla platformy związanych z czujnikiem orientacji.