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
























