【WP開發(fā)】實現“搖一搖”功能
盡管我的微信是每八個月登錄一次,但我相信各位玩得比我多。微信有一個“搖一搖”功能,這個功能其實是利用了加速度傳感器來實現的,這個傳感器,我估計再低端的手機都會有的,這是嚴重基本的傳感器。
重力加速度既可以用于判斷手機當前所放置的方向,也可以用來檢測運動方向,當用戶甩手機時就會產生運動加速度。
位于Windows.Devices.Sensors命名空間下的Accelerometer類封裝了重力加速器相關的操作,“搖一搖”可以判斷手機在X,Y,Z三個方向上的加速度來實現,甩手機時比較激動,因此,X,Y,Z三個值的絕對值都會大于1,用力甩的話可以達到1.7,1.8左右,不知道能不能達到2,反正我沒試過,高空墜落時可能會有,有興趣的朋友可以從樓頂把手機扔下去試試。
對于使用傳感器時的坐標系,使用的設備坐標,不論是哪個傳感器,設備坐標的位置和方向是一樣的,這里我畫了一個草圖,不是十分準確,但我相信初中生都能看懂。
箭頭所指的方向是正方向,相反的方向就是負方向。
有了以上的思想準備,估計你都知道怎么做了,原理是分別讀取X,Y,Z三軸上的數據,然后判斷它們的值,如果值較大,說明手機正在“激情”中,即用戶在甩動手機。
不僅是“搖一搖”,使用這個,還可以做音樂播放器的切歌操作。比如,向左甩播放上一首歌,向右甩播下一首歌。左右甩動只需判斷X軸上的值即可,舉個 例子,當X軸上的值小于-1.6時,可以認為用戶正在拼命向左甩動;如果大于1.6表明用戶把手機向右甩。同理,向上甩動Y軸的值為正值,值越大;向下甩 則Y軸上的值為負,值越??;把手機屏幕對著天空用力拋的時候,Z軸上的值為正,值越來越大;反之越來越小。
先給大家講講例子,我這個例子不復雜,就是先準備好10張MM的靚照,當手機被甩時,從10張照片中隨機抽出一張來顯示。
Accelerometer類本來有一個Shaken事件,當甩手機時發(fā)生,但這個事件目前只在平板電腦上引發(fā),在手機上不會發(fā)生。畢竟RT的API沒有完全移植。雖然不引發(fā)該事件,不過我們可以通過加速器的讀數自己來判斷。
首先,獲取加速器的實例。
- Accelerometer acc = null;
- ........
- acc = Accelerometer.GetDefault();
很簡單,一個GetDefault就能返回相關的實例。然后,設置一下報告實時數據的時間間隔,因為甩動的話,不需要過于精確,我這里選擇200毫秒報告一次,也不必須太快。
- acc.ReportInterval = 200;
接著,處理當前程序窗口的VisibilityChanged事件,當窗口可見時才讀取加速度數據,窗口不可見時讀了也沒什么用。
- Window.Current.VisibilityChanged += OnWindowVisibilityChanged;
- ........
- private void OnWindowVisibilityChanged ( object sender, Windows.UI.Core.VisibilityChangedEventArgs e )
- {
- if (e.Visible)
- {
- acc.ReadingChanged += acc_ReadingChanged;
- }
- else
- {
- acc.ReadingChanged -= acc_ReadingChanged;
- }
- }
當有新的讀數報告時,會發(fā)生ReadingChanged事件,處理該事件,就能獲取到X,Y,Z軸上的讀數。
- async void acc_ReadingChanged ( Accelerometer sender, AccelerometerReadingChangedEventArgs args )
- {
- // 將讀數乘以100,以擴大其值,便于比較
- double x = args.Reading.AccelerationX * 100d;
- double y = args.Reading.AccelerationY * 100d;
- double z = args.Reading.AccelerationZ * 100d;
- System.Diagnostics.Debug.WriteLine("X= {0:N0}, Y= {1:N0}, Z= {2:N0}", x, y, z);
- await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
- async () =>
- {
- // 具體取什么數值,可以經過試驗獲得
- if (Math.Abs(x) > 145d || Math.Abs(y) > 140d || Math.Abs(z) > 155d)
- {
- // 顯示靚圖
- }
- });
- }
我這里把三個讀數都乘以100,只是我覺得好看罷了,如果你不喜歡就不用乘以100了。
因為用戶“搖一搖”的時候,我們代碼并不關心他向哪個方向甩,反正他是在甩動即可,所以,在判斷的時候可以取x, y, z的絕對值,用于判斷的參考數字不是固定的,大家可以自己試,試到合適的數字就可以了。我這里是當X上的值的絕對值大于145(1.45),Y的絕對值大 于140(1.4),Z的絕對值大于155(1.55)時就認為是用戶在搖動手機。
就是這樣,“搖一搖”功能就出來了,然后各位可以在真面上搖幾下(模擬器上很難測),就看到MM了。
本文鏈接:http://www.cnblogs.com/tcjiaan/p/4009105.html