【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 = 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;
            }
        }

当有新的读数报告时,会发生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

时间: 2024-10-12 19:39:01

【WP开发】实现“摇一摇”功能的相关文章

C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现

”摇一摇周边“是微信提供的一种新的基于位置的连接方式.用户通过“摇一摇”的“周边”页卡,可以与线下商户进行互动,获得商户提供的个性化的服务.微信4月份有一个赠送摇一摇设备的活动,我们有幸获得赠送资格,取得一个摇一摇的设备用来测试这个新增的.很有潜力的功能.”摇一摇周边“是微信基于低功耗蓝牙技术的 O2O 入口级应用,与微信的其他线下连接能力一道,加速促成了微信 O2O 闭环的实现.本文主要介绍一摇设备的配置使用,以及如何在开发层面上,定义及实现微信摇一摇的功能接口. 1.IBeacon基础知识介

iOS开发——高级技术&摇一摇功能的实现

摇一摇功能的实现 在AppStore中多样化功能越来越多的被使用了,所以今天就开始介绍一些iOS开发的比较实用,但是我们接触的比较少的功能,我们先从摇一摇功能开始 在 UIResponder中存在这么一套方法 1 - (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0); 2 3 - (void)motionEnded:

安卓开发 摇一摇功能

============问题描述============ 以下是我的摇一摇实现的代码 public class Yao extends Activity implements SensorEventListener {  EditText tv =(EditText)findViewById(R.id.editText1);  Button button =(Button)findViewById(R.id.button1);  SensorManager sensorManager = nul

Android 使用加速度传感器实现摇一摇功能及优化

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456 目前很多应用已经实现了摇一摇功能,这里通过讲解该功能的原理及实现回顾一下加速度传感器的使用: 1.首先获得传感器管理器的实例 sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); 2.通过传感器管理器获得加速传感器 accelerateSensor = getSensorManager(cont

Android 微信摇一摇功能实现

开发之前 今天学习了一下传感器, 脑子里就蹦出了微信的摇一摇, 于是鼓了鼓勇气抽空写了出来, 本人菜鸟一枚, 希望大神们多多指点 开发环境 Android Studio 2.2.1 JDK1.7 API 24 Gradle 2.2.1 相关知识点 加速度传感器 补间动画 手机震动 (Vibrator) 较短 声音/音效 的播放 (SoundPool) 开始开发 案例预览 案例分析 我们接下来分析一下这个案例, 当用户晃动手机时, 会触发加速传感器, 此时加速传感器会调用相应接口供我们使用, 此时

android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

上一篇写了如何在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,现在来讲讲摇一摇功能开发. 同样用了一个Service去实现摇一摇. ShakeListener继承自SensorEventListener,当加速度感应器感受到重力变化,就去通知onShakeListener调用onShake(), 在震动的同时随机一首歌. 一,加速度感应器 在这里需要设置一个速度阈值和时间间隔,控制一定的时间间隔才能触发第二次震动

微信开发微信“摇一摇·周边”正式开放

今日,在微信公开课第三季长沙站现场,微信团队宣布“摇一摇·周边”(以下简称“摇周边”)正式对外开放.拥有微信认证的公众帐号商户,均可通过摇周边的商户申请平台(https://zb.weixin.qq.com/)或者微信公众平台后台申请入驻.联合微信支付.公众帐号.微信卡包,摇周边为更多商家提供了便捷连接用户和精准近场服务的能力. 据悉,摇周边还将于 4 月 13 日开展“免费送设备”体验活动,前 2000 名入驻的商户将有机会获得微信团队免费赠送的摇周边设备. 摇周边是微信基于低功耗蓝牙技术的

利用html5实现类似微信的手机摇一摇功能,并播放音乐,并且解决中文乱码的问题。

转载了@三井学长:http://blog.csdn.net/david1030/article/details/8229008 转载了@Hello Csn楠!:http://www.cnblogs.com/csn0721/ 1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向等. 2.  deviceMotion:封装了运动传感器数据的事件,可以获取手机运动状态下的运动加速度等数据. 不多说直接上代码, Javas

html5实现摇一摇功能

觉得挺好,就复制一下,以后或许用的着.... 用HTML5实现手机摇一摇的功能的教程 阅读:2057次   时间:2013-09-05 14:55:18   字体:[大 中 小] 在百度开发者大会上我介绍过HTML5另外一个重要特性就是DeviceOrientation,它将底层的方向传感器和运动传感器进行了高级封装,提供了DOM事件的支持.这个特性包括两种事件:1.  deviceOrientation:封装了方向传感器数据的事件,可以获取手机静止状态下的方向数据,例如手机所处角度.方位.朝向