天天看點

【WP開發】使用磁傾儀

磁傾儀,也叫傾斜儀,主要用來檢測手機裝置在各個軸上旋轉的角度。注意,磁傾儀與陀螺儀的差異,陀螺儀的關注點是旋轉的角速度,它并不關注角度,隻注重速度。而磁傾儀的讀數就是裝置傾斜的角度。

不管是使用重力感應器,方向感應器,還是陀螺儀、磁傾儀,我們首先必須知道相對于手機裝置的坐标系。為了能更加直感,我畫了個草圖,也比較難看,望見諒。

【WP開發】使用磁傾儀

你拿着手機,讓手機垂直放置,并且螢幕對着你,可以用來照鏡子。當你拿着手機照鏡子時,坐标原點在手機的左下角。

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度。

為了能更好地了解磁傾儀的讀數,我特地邀請了孫大聖來向大家表演一下筋鬥雲。詳見示例代碼。

【WP開發】使用磁傾儀
【WP開發】使用磁傾儀
【WP開發】使用磁傾儀
【WP開發】使用磁傾儀

看完孫大聖精彩的表演後,相信你對磁傾儀會有一個更直覺的認知。

示例源碼:https://files.cnblogs.com/tcjiaan/InclinometerApp.zip