【WP开发】实现“摇一摇”功能

移动开发
尽管我的微信是每八个月登录一次,但我相信各位玩得比我多。微信有一个“摇一摇”功能,这个功能其实是利用了加速度传感器来实现的,这个传感器,我估计再低端的手机都会有的,这是严重基本的传感器。

尽管我的微信是每八个月登录一次,但我相信各位玩得比我多。微信有一个“摇一摇”功能,这个功能其实是利用了加速度传感器来实现的,这个传感器,我估计再低端的手机都会有的,这是严重基本的传感器。

重力加速度既可以用于判断手机当前所放置的方向,也可以用来检测运动方向,当用户甩手机时就会产生运动加速度。

位于Windows.Devices.Sensors命名空间下的Accelerometer类封装了重力加速器相关的操作,“摇一摇”可以判断手机在X,Y,Z三个方向上的加速度来实现,甩手机时比较激动,因此,X,Y,Z三个值的绝对值都会大于1,用力甩的话可以达到1.7,1.8左右,不知道能不能达到2,反正我没试过,高空坠落时可能会有,有兴趣的朋友可以从楼顶把手机扔下去试试。

对于使用传感器时的坐标系,使用的设备坐标,不论是哪个传感器,设备坐标的位置和方向是一样的,这里我画了一个草图,不是十分准确,但我相信初中生都能看懂。

[[120978]]

箭头所指的方向是正方向,相反的方向就是负方向。

有了以上的思想准备,估计你都知道怎么做了,原理是分别读取X,Y,Z三轴上的数据,然后判断它们的值,如果值较大,说明手机正在“激情”中,即用户在甩动手机。

不仅是“摇一摇”,使用这个,还可以做音乐播放器的切歌操作。比如,向左甩播放上一首歌,向右甩播下一首歌。左右甩动只需判断X轴上的值即可,举个 例子,当X轴上的值小于-1.6时,可以认为用户正在拼命向左甩动;如果大于1.6表明用户把手机向右甩。同理,向上甩动Y轴的值为正值,值越大;向下甩 则Y轴上的值为负,值越小;把手机屏幕对着天空用力抛的时候,Z轴上的值为正,值越来越大;反之越来越小。

先给大家讲讲例子,我这个例子不复杂,就是先准备好10张MM的靓照,当手机被甩时,从10张照片中随机抽出一张来显示。

Accelerometer类本来有一个Shaken事件,当甩手机时发生,但这个事件目前只在平板电脑上引发,在手机上不会发生。毕竟RT的API没有完全移植。虽然不引发该事件,不过我们可以通过加速器的读数自己来判断。

首先,获取加速器的实例。

  1. Accelerometer acc = null
  2.         ........ 
  3.  
  4.         acc = Accelerometer.GetDefault(); 

很简单,一个GetDefault就能返回相关的实例。然后,设置一下报告实时数据的时间间隔,因为甩动的话,不需要过于精确,我这里选择200毫秒报告一次,也不必须太快。

  1. acc.ReportInterval = 200

接着,处理当前程序窗口的VisibilityChanged事件,当窗口可见时才读取加速度数据,窗口不可见时读了也没什么用。

  1. Window.Current.VisibilityChanged += OnWindowVisibilityChanged; 
  2.      ........ 
  3.       private void OnWindowVisibilityChanged ( object sender, Windows.UI.Core.VisibilityChangedEventArgs e ) 
  4.       { 
  5.           if (e.Visible) 
  6.           { 
  7.               acc.ReadingChanged += acc_ReadingChanged; 
  8.           } 
  9.           else 
  10.           { 
  11.               acc.ReadingChanged -= acc_ReadingChanged; 
  12.           } 
  13.       } 

当有新的读数报告时,会发生ReadingChanged事件,处理该事件,就能获取到X,Y,Z轴上的读数。

  1. async void acc_ReadingChanged ( Accelerometer sender, AccelerometerReadingChangedEventArgs args ) 
  2.      { 
  3.          // 将读数乘以100,以扩大其值,便于比较 
  4.          double x = args.Reading.AccelerationX * 100d; 
  5.          double y = args.Reading.AccelerationY * 100d; 
  6.          double z = args.Reading.AccelerationZ * 100d; 
  7.          System.Diagnostics.Debug.WriteLine("X= {0:N0}, Y= {1:N0}, Z= {2:N0}", x, y, z); 
  8.          await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, 
  9.              async () => 
  10.              { 
  11.                  // 具体取什么数值,可以经过试验获得 
  12.                  if (Math.Abs(x) > 145d || Math.Abs(y) > 140d || Math.Abs(z) > 155d) 
  13.                  { 
  14.                      // 显示靓图 
  15.                  } 
  16.              }); 
  17.      } 

我这里把三个读数都乘以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

责任编辑:chenqingxiang 来源: cnblogs
相关推荐

2024-01-15 08:21:12

Android应用方式

2012-04-28 14:21:22

HTML5

2015-07-29 15:00:18

iPhone摇一摇

2023-11-14 15:51:38

苹果系统App

2013-02-20 11:38:13

2015-03-04 11:09:42

微信摇一摇红包

2014-07-11 14:55:59

傲游浏览器

2016-04-21 11:36:08

阿里无线技术营销

2021-04-29 05:58:20

微信摇一摇抖音

2015-03-03 09:59:31

微信摇一摇红包

2021-04-24 08:24:28

Windows10操作系统21H2

2015-05-15 15:10:16

红包

2021-12-15 06:12:55

App

2015-12-29 16:58:03

飞凡

2015-01-22 15:44:55

Android源码音乐播放器

2015-05-04 16:35:09

互联网

2018-02-07 08:18:23

微信微信6.6.2删除好友

2015-07-14 14:06:39

IPIP地址

2015-12-02 14:36:03

魅族

2011-12-12 14:41:57

点赞
收藏

51CTO技术栈公众号