关于H5实现的手机摇一摇

来源:互联网 发布:裤子 知乎 编辑:程序博客网 时间:2024/06/05 00:32
[html] view plaincopy
  1. <!DOCTYPE html>  
  2. <html lang="en">  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.     </head>  
  6.     <body>  
  7.         <div id="status"></div>     
  8.     </body>  
  9.     <script>  
  10.        var shake=4000,   
  11.            last_update=0,   
  12.            count=0,  
  13.            x=y=z=last_x=last_y=last_z=0;  
  14.        if(window.DeviceMotionEvent){  
  15.             window.addEventListener("devicemotion",deviceMotionHandler,false);  
  16.        }else{  
  17.          alert("本设备不支持devicemotion事件");  
  18.        }  
  19.        console.log(new Date().valueOf());  
  20.        function deviceMotionHandler(eventData){  
  21.             var acceleration = eventData.accelerationIncludingGravity,  
  22.                 currTime=new Date().valueOf(),  
  23.                 diffTime=currTime-last_update;  
  24.   
  25.                 if(diffTime>100){  
  26.                    last_update=currTime;  
  27.                    x=acceleration.x;  
  28.                    y=acceleration.y;  
  29.                    z=acceleration.z;  
  30.                    var speed=Math.abs(x+y+z-last_x-last_y-last_z)/diffTime*10000  
  31.                    var status=document.getElementById("status");  
  32.                    if(speed>shake){  
  33.                          count++;  
  34.                          status.innerHTML = "你摇了中"+count+"次" ;  
  35.                    }  
  36.                    last_x = x;  
  37.                    last_y = y;  
  38.                    last_z = z;  
  39.                 }  
  40.        }  
  41.     </script>  
  42. </html>  

devicemotion 获取设备加速度信息。其事件对象返回有3个值,但是我用到的是accelerationIncludingGravity 考虑了重力的影响。地球引力值是9.81 返回的X,Y,Z 其中的Z轴就是9.81 不过有正负之分 水平向上在安卓里面显示的是是+9.81 在苹果里面显示的是-9.81 (最然对于我们的计算没有影响,但是写出来让大家了解一下,免得测试的时候有疑问)。

注意:返回的X,Y,Z的属性值的单位是m/s^2

acceleration
这个属性是没有考虑到重力影响的,很奇怪,我也在想为什么出两个标准。这个难道是考虑在真空吗。。。。

OK,来说说我们的代码。

设置了阀值4000(就是当加速度达到了这个值的时候,就触发了摇一摇的程序)。

获取上一次的时间last_update.

设置一个count来告诉大家你摇动了几次。

初始化各个轴的加速读,以及上一次的加速last_X,last_Y,last_Z.

如果设备支持DeviceMotionEvent就给window进行事件绑定。

获取当前时间currTime。

获取当前事件对象的accelerationIncludingGravity属性。

每100毫秒进行一次获取和判断加速度 X,Y,Z。

求的某一次的加速speed是否达到了阀值4000.

如果达到了就出发摇一摇事件。

最后再把这次的X,Y,Z的速度值复制给last_x,y,z.

真个代码的解析就是这样了。

可能我在某一块理解的不对,欢迎大家评论下 一起学习,研究。

0 0
原创粉丝点击