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


Posted in Javascript onJuly 22, 2017

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

实现原理:

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

<!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的图片

Javascript 相关文章推荐
Javascript 网页黑白效果实现代码(兼容IE/FF等)
Apr 23 Javascript
JS俄罗斯方块,包含完整的设计理念
Dec 11 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
Nov 05 Javascript
JS小游戏之宇宙战机源码详解
Sep 25 Javascript
EasyUI中combobox默认值注意事项
Mar 01 Javascript
JavaScript随机生成信用卡卡号的方法
Apr 07 Javascript
vue做网页开场视频的实例代码
Oct 20 Javascript
Vue.js 中的 v-cloak 指令及使用详解
Nov 19 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
Dec 11 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
Dec 16 Javascript
js实现旋转木马轮播图效果
Jan 10 Javascript
javascript实现蒙版与禁止页面滚动
Jan 11 Javascript
一个简易的js图片轮播效果
Jul 22 #Javascript
基于JS脚本语言的基础语法详解
Jul 22 #Javascript
JS原生轮播图的简单实现(推荐)
Jul 22 #Javascript
JS+HTML5实现图片在线预览功能
Jul 22 #Javascript
JQuery和html+css实现带小圆点和左右按钮的轮播图实例
Jul 22 #jQuery
JS原生带小白点轮播图实例讲解
Jul 22 #Javascript
JS按钮闪烁功能的实现代码
Jul 21 #Javascript
You might like
在wamp集成环境下升级php版本(实现方法)
2013/07/01 PHP
php自定义错误处理用法实例
2015/03/20 PHP
PHP的数组中提高元素查找与元素去重的效率的技巧解析
2016/03/03 PHP
php简单压缩css样式示例
2016/09/22 PHP
JS模拟多线程
2007/02/07 Javascript
关于jQuery对象数据缓存Cache原理以及jQuery.data详解
2013/04/07 Javascript
最短的IE判断var ie=!-[1,]分析
2014/05/28 Javascript
JS折半插入排序算法实例
2015/12/02 Javascript
js实现卡片式项目管理界面UI设计效果
2015/12/08 Javascript
vue2.0 中#$emit,$on的使用详解
2017/06/07 Javascript
Angular2 自定义validators的实现方法
2017/07/05 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
使用vue-cli导入Element UI组件的方法
2018/05/16 Javascript
vue-image-crop基于Vue的移动端图片裁剪组件示例
2018/08/28 Javascript
微信小程序遍历Echarts图表实现多个饼图
2019/04/25 Javascript
node.js实现带进度条的多文件上传
2020/03/27 Javascript
浅谈Vue2.4.0 $attrs与inheritAttrs的具体使用
2020/03/08 Javascript
bootstrap-closable-tab可实现关闭的tab标签页插件
2020/08/09 Javascript
javascript操作向表格中动态加载数据
2020/08/27 Javascript
[49:05]OG vs Newbee 2019DOTA2国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
python中多层嵌套列表的拆分方法
2018/07/02 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
python各层级目录下import方法代码实例
2020/01/20 Python
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
苹果台湾官网:Apple台湾
2019/01/05 全球购物
创业计划书六个要素
2013/12/26 职场文书
材料物理专业求职信
2014/09/01 职场文书
解除劳动合同证明书
2014/09/26 职场文书
2014年护士工作总结范文
2014/11/11 职场文书
龙猫观后感
2015/06/09 职场文书
经营场所证明范本
2015/06/19 职场文书
聘用合同范本
2015/09/21 职场文书
服务器SVN搭建图文安装过程
2022/06/21 Servers