欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

JS实现微信摇一摇原理解析

本文为大家分享了JS实现微信摇一摇的原理,供大家参考,具体内容如下

实现原理:

1.微信摇一摇事件需要有硬件支撑,必须要求手机中有陀螺仪
2.在JS中给window添加ondevectionmotion事件。该事件在手机晃动,即手机中的陀螺仪发生旋转,该事件会触发
3.触发ondevectionmotion事件,会产生一个事件对象,通过该对象中的键值(accelerationIncludingGravity)来获得该重力加速器对象
4.重力加速器对象中含有陀螺仪的坐标,通过重力加速器对象.x - .y - .z 获取陀螺仪当前的坐标

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  <title>微信摇一摇</title>
 </head>
 <body>
  <!--请摇一摇-->
 </body>
 <script type="text/javascript">
  function randomNum(m,n){
   return Math.floor(Math.random(n - m + 1) + m);
  }
  //cover设置背景尺寸
  //将背景图按所在标签的宽高,缩放
  document.body.style.backgroundSize = "cover";
  //设置body的背景图
  document.body.style.backgroundImage = "url(img/bg.jpg)" ;
  //事件设备:触发该事件需要硬件支持
  //摇一摇功能:
  //1.手机中的陀螺仪加速两次 加速器的差值当达到某个值时,则认为是手机晃动事件
  //2.设置手机晃动事件前,获取加速器的值
  //3.添加手机晃动事件;    
  //获取手机晃动前加速器的值,创建一个对象获取
  var currentValue = {
   x : 0,
   y : 0,
   z : 0
  };
  //获取手机晃动之后加速器的值,创建一个对象获取
  var lastValue = {
   x : 0,
   y : 0,
   z : 0
  }
  //设置晃动的最小的距离,只有达到该距离时,才执行摇一摇事件
  var minValue = 20;
  //当手机触发摇一摇事件时,我们得到此时的位置信息,存储到一个p标签上
  //理论上讲:陀螺仪事件中的加速器是无法静止的;
  var p1 = document.createElement("p");
  //第一种方式:
  var img1 = document.createElement("img");
  img1.style.width = "375px";
  img1.style.height = "560px";
  //手机晃动事件
  window.ondevicemotion = function(e){
   //获取对象
   var event1 = event || e;
   //获取加速器对象,为了获取陀螺仪上的坐标信息
   var acceleration = event1.accelerationIncludingGravity;
   //记录当前加速器的值
   currentValue.x = acceleration.x;
   currentValue.y = acceleration.y;
   currentValue.z = acceleration.z;
   //判断微信摇一摇事件(手机是否晃动)
   if (Math.abs(currentValue.x - lastValue.x) >= minValue || Math.abs(currentValue.y - lastValue.y) > minValue || Math.abs(currentValue.z - lastValue.z) > minValue) {
    //说明摇一摇事件触发
    //实现微信摇一摇,可以将摇一摇中的图片,作为body的背景图
    //随机一张图片的下标(1 - 5)
    var ranN = randomNum(1,6);
    //创一个定时器
    var timer = setInterval(function(){
     ranN ++
     if (ranN == 6) {
      ranN = 1;
     }
     //为当前的body设置背景图
     //document.body.style.backgroundImage = "url(img/"+ranN+".jpg)";
     //为当前img设置路径
     img1.src = "img/"+ranN+".jpg";
       
    },200);
    //设置一个延时器,延时一段时间后消除延时器
    setTimeout(function(){
     clearInterval(timer);
    },1000);
   }
   //记录最后的值(保存上一次晃动事件中的加速器的值)
   lastValue.x = currentValue.x;
   lastValue.y = currentValue.y;
   lastValue.z = currentValue.z;
  }
  document.body.appendChild(img1);
 </script>
</html>

注意:该代码中没有上传图片,如需要运行需要自己在代码的同级目录创建一个img文件夹,里面放上从1到6的后缀为.jpg的图片

来自  https://www.jb51.net/article/119285.htm

普通分类: