磁傾儀,也叫傾斜儀,主要用來檢測手機裝置在各個軸上旋轉的角度。注意,磁傾儀與陀螺儀的差異,陀螺儀的關注點是旋轉的角速度,它并不關注角度,隻注重速度。而磁傾儀的讀數就是裝置傾斜的角度。
不管是使用重力感應器,方向感應器,還是陀螺儀、磁傾儀,我們首先必須知道相對于手機裝置的坐标系。為了能更加直感,我畫了個草圖,也比較難看,望見諒。

你拿着手機,讓手機垂直放置,并且螢幕對着你,可以用來照鏡子。當你拿着手機照鏡子時,坐标原點在手機的左下角。
1、從手機左下角,水準方向為X軸,向右為正值,向左為負值;
2、垂直方向為Y軸,往上為正值,往下為負值;
3、Z軸與手機螢幕垂直。當你拿着手機照鏡子時,Z軸的正方向正指着你。
當你握着手機左右搖動時,就是繞着Y軸旋轉;當你拿着手機前後翻時,就繞着X軸旋轉;當你把手機放在水準桌面上轉動時,就繞着Z軸旋轉。
磁傾儀封裝在Windows.Devices.Sensors命名空間下的Inclinometer類中,磁傾儀的讀數由InclinometerReading類來包裝。
PitchDegrees屬性:圍繞X軸旋轉的角度,機關是角度。
RollDegrees屬性:圍繞Y軸旋轉的角度。
YawDegrees屬性:圍繞Z軸旋轉的角度。
和其他傳感器的使用一樣,第一步,通過GetDefault方法得到相應傳感器的執行個體引用。
Inclinometer _inclinometer = null;
……
// 初始化傾斜儀
_inclinometer = Inclinometer.GetDefault();
然後設定報告讀數的時間間隔,機關為毫秒,一般20毫秒以上的值就可以了,沒有必要裝置得太小,最小值不能小于MinimumReportInterval屬性的值。
_inclinometer.ReportInterval = 20;
最後,處理ReadingChanged事件,以讀取最新的讀數。
Window.Current.VisibilityChanged += CurrentWindow_VisibilityChanged;
……
private void CurrentWindow_VisibilityChanged ( object sender, Windows.UI.Core.VisibilityChangedEventArgs e )
{
if (e.Visible)
{
_inclinometer.ReadingChanged += _inclinometer_ReadingChanged;
}
else
{
_inclinometer.ReadingChanged -= _inclinometer_ReadingChanged;
}
}
async void _inclinometer_ReadingChanged ( Inclinometer sender, InclinometerReadingChangedEventArgs args )
{
// 擷取讀數
}
通過事件參數InclinometerReadingChangedEventArgs的Reading屬性可以得到包含讀數的InclinometerReading對象引用,就可以取得手機圍繞各個坐标軸轉動的角度了。
大家要注意的是,
a、當圍繞Z軸旋轉時,0或360度是指向磁北極的,方向為逆時鐘旋轉,這個與羅盤有點像;
b、當圍繞X軸旋轉時,當手機水準放時(螢幕向着天空),為0度。當手機向你這邊翻動時,為正值,0到180度;當手機向外翻時(背對着你),為負值,0到-180度;
c、當圍繞Y軸轉動時,向左轉為負值,0到-90度;向右轉為正值,0到90度。
為了能更好地了解磁傾儀的讀數,我特地邀請了孫大聖來向大家表演一下筋鬥雲。詳見示例代碼。
看完孫大聖精彩的表演後,相信你對磁傾儀會有一個更直覺的認知。
示例源碼:https://files.cnblogs.com/tcjiaan/InclinometerApp.zip