【WP开发】实现“摇一摇”功能
尽管我的微信是每八个月登录一次,但我相信各位玩得比我多。微信有一个“摇一摇”功能,这个功能其实是利用了加速度传感器来实现的,这个传感器,我估计再低端的手机都会有的,这是严重基本的传感器。
重力加速度既可以用于判断手机当前所放置的方向,也可以用来检测运动方向,当用户甩手机时就会产生运动加速度。
位于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事件,当甩手机时发生,但这个事件目前只在平板电脑上引发,在手机上不会发生。毕竟RT的API没有完全移植。虽然不引发该事件,不过我们可以通过加速器的读数自己来判断。
首先,获取加速器的实例。
Accelerometer acc = null;
........ acc = Accelerometer.GetDefault();
很简单,一个GetDefault就能返回相关的实例。然后,设置一下报告实时数据的时间间隔,因为甩动的话,不需要过于精确,我这里选择200毫秒报告一次,也不必须太快。
acc.ReportInterval = ;
接着,处理当前程序窗口的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;
}
}
当有新的读数报告时,会发生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://files.cnblogs.com/tcjiaan/ShakenExample.zip
【WP开发】实现“摇一摇”功能的更多相关文章
- C#开发微信门户及应用(38)--微信摇一摇红包功能
摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...
- C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
”摇一摇周边“是微信提供的一种新的基于位置的连接方式.用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互动,获得商户提供的个性化的服务.微信4月份有一个赠送摇一摇设备的活动,我们有幸获得赠送资格, ...
- iOS开发——高级技术&摇一摇功能的实现
摇一摇功能的实现 在AppStore中多样化功能越来越多的被使用了,所以今天就开始介绍一些iOS开发的比较实用,但是我们接触的比较少的功能,我们先从摇一摇功能开始 在 UIResponder中存在这么 ...
- IOS开发之——类似微信摇一摇的功能实现
首先,一直以为摇一摇的功能实现好高大上,结果百度了.我自己也模仿写了一个demo.主要代码如下: 新建一个项目,名字为AnimationShake. 主要代码: - (void)motionBegan ...
- iOS开发 传感器(加速计、摇一摇、计步器)
一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...
- iOS开发——高级篇——传感器(加速计、摇一摇、计步器)
一.传感器 1.什么是传感器传感器是一种感应\检测周围环境的一种装置, 目前已经广泛应用于智能手机上 传感器的作用用于感应\检测设备周边的信息不同类型的传感器, 检测的信息也不一样 iPhone中的下 ...
- Android 摇一摇之双甩功能
Android 摇一摇之双甩功能 最近做一个摇一摇的功能 网上相关代码很多 但是这次的需求有点奇葩 要求是摇两次才生效 看起来好像很简单 但真正要做遇到的问题还是很多 时间限制 机型灵敏性 摇动的方式 ...
- 用HTML5实现手机摇一摇的功能(转)
在百度开发者大会上我介绍过HTML5另外一个重要特性就是DeviceOrientation,它将底层的方向传感器和运动传感器进行了高级封装,提供了DOM事件的支持.这个特性包括两种事件: 1.devi ...
- Android 使用加速度传感器实现摇一摇功能及优化
如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得 ...
随机推荐
- JavaWeb 命名规则
命名规范命名规范命名规范命名规范 本规范主要针对java开发制定的规范项目命名项目命名项目命名项目命名 项目创建,名称所有字母均小写,组合方式为:com.company.projectName.com ...
- 网上搜集了点资料,学web的人互相分享共同进步吧(php编码的好习惯必须养成)
网上搜集了点资料,学web的人互相分享共同进步吧 一.优秀的代码应该是什么样的? 优秀的PHP代码应该是结构化的.大段的代码应该被分割整理成一个个函数或方法,而那些不起眼的小段代码则应该加上注释,以便 ...
- 20145301&20145321&20145335实验四
20145301&20145321&20145335实验四 这次实验我的组员为:20145301赵嘉鑫.20145321曾子誉.20145335郝昊 实验内容详见:实验四
- 设计模式之美:Observer(观察者)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Observer 模式结构样式代码. 别名 Dependency Publish-Subscribe 意图 定义对象间的一种一对 ...
- 站在移动互联时代的十字路口上_deviceone
最近总能看到类似“App已死,服务永生”.“App必死,web永生” .“App已死,微信建站已生”这样的文章.不晓得这些网络写手到底是想代表某些公司的立场.还是想要表达怎么样的一个情结,文章中语气都 ...
- 作业3.2:psp
PSP2.1 Personal Software Process Stages Time Planning 计划 20min Estimate 估计这个任务需要多长时间 3.5h Developmen ...
- 项目八:团队项目——Alpha阶段项目总结
1.项目的预期目标 a.完成游戏的基本功能 b.游戏难度的玩家手动调节 c.游戏能够良好的运行完成 与前期的需求分析对比: 第一点不同是游戏的难度调节,原来是想通过选择难度来调节的,但由于难度的分层上 ...
- java POI实现向Excel中插入图片
做Web开发免不了要与Excel打交道.今天老大给我一个任务-导出Excel.开始想的还是蛮简单的,无非就是查找,构建Excel,response下载即可.但是有一点不同,就是要加入图片, ...
- Android SDK content Loader has encountered a problem.parseSdkContent failed
打开Eclipse,弹出Android SDK content Loader has encountered a problem.parseSdkContent failed,当点击detail按钮, ...
- sourcesafe.light 开源项目启动
sourcesafe.light 源于一个2D独立砖块沙盒游戏. 在这个游戏的设计中碰到了一个瓶颈:这个游戏想把玩家变成一个个neo,在矩阵世界中没有什么不可以修改. 这个游戏要跨平台,玩家的修改操作 ...