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 线程上运行该代码。