Xamarin.Essentials:OrientationSensor

OrientationSensor 类可让你监视设备在三维空间中的方向。

注意

此类用于确定设备在三维空间中的方向。 如果需要确定设备的视频显示器是处于纵向模式还是横向模式,请使用可从 DeviceDisplay 类获得的 ScreenMetrics 对象的 Orientation 属性。

入门

若要开始使用此 API,请阅读 Xamarin.Essentials 的入门指南,确保在项目中正确安装和设置库。

使用 OrientationSensor

在类中添加对 Xamarin.Essentials 的引用:

using Xamarin.Essentials;

通过调用 Start 方法启用 OrientationSensor 以便监视对设备方向所做的更改,并通过调用 Stop 方法进行禁用。 然后通过 ReadingChanged 事件反馈任何变化。 示例用法如下:


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.
        }
    }
}

OrientationSensor 读数以 Quaternion 的形式返回报告,描述了设备基于两个三维坐标系的方向:

设备(通常为手机或平板电脑)的三维坐标系具有以下轴:

  • X 轴正方向指向显示器右侧(在纵向模式下)。
  • Y 轴正方向指向显示器顶部(在纵向模式下)。
  • Z 轴正方向指向屏幕外侧。

地球的三维坐标系具有以下轴:

  • X 轴正方向与地球表面相切并指向东边。
  • Y 轴正方向也与地球表面相切并指向北边。
  • Z 轴正方向与地球表面垂直并指向上边。

Quaternion 描述了设备坐标系相对于地球坐标系的旋转。

Quaternion 值与绕轴旋转密切相关。 如果旋转的轴是规范化矢量 (ax, ay, az),并且旋转角度为 Θ,则四元数的 (X, Y, Z, W) 分量是:

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

这些是右手坐标系,因此右手的拇指指向旋转轴的正方向,手指弯曲表示正角的旋转方向。

示例:

  • 当设备平放在桌上,屏幕朝上,设备顶部(在纵向模式下)指向北方时,这两个坐标系会对齐。 Quaternion 值表示标识四元数 (0, 0, 0, 1)。 可以相对于此位置分析所有旋转。

  • 当设备平放在桌上,屏幕朝上,设备顶部(在纵向模式下)指向西方时,Quaternion 值为 (0, 0, 0.707, 0.707)。 设备已绕地球的 Z 轴旋转 90 度。

  • 当设备保持直立,顶部(在纵向模式下)指向天空,设备背部朝向北方时,设备已绕 X 轴旋转 90 度。 Quaternion 值为 (0.707, 0, 0, 0.707)。

  • 如果设备的左边缘在桌子上,顶部指向北边,则设备已绕 Y 轴旋转 -90 度(或绕 Y 轴负方向旋转 90 度)。 Quaternion 值为 (0, -0.707, 0, 0.707)。

传感器速度

  • 最快 – 尽快获取传感器数据(不保证在 UI 线程上返回)。
  • 游戏 – 适合游戏的速度(不保证在 UI 线程上返回)。
  • 默认 - 适合屏幕方向更改的默认速率。
  • UI – 适合常规用户界面的速率。

如果事件处理程序不能保证在 UI 线程上运行,并且如果事件处理程序需要访问用户界面元素,请使用 MainThread.BeginInvokeOnMainThread 方法在 UI 线程上运行该代码。

API