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 相关文章推荐
jquery的extend和fn.extend的使用说明
Jan 09 Javascript
改进UCHOME的记录发布,增强可访问性用户体验
Jan 17 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
Aug 18 Javascript
javascript中字符串拼接详解
Sep 26 Javascript
javascript实现动态改变层大小的方法
May 14 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
Oct 27 Javascript
Bootstrap Table使用方法详解
Aug 01 Javascript
基于 webpack2 实现的多入口项目脚手架详解
Jun 26 Javascript
Angular学习教程之RouterLink花式跳转
May 03 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
May 31 Javascript
vant-ui组件调用Dialog弹窗异步关闭操作
Nov 04 Javascript
Vue ​v-model相关知识总结
Jan 28 Vue.js
一个简易的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
php设计模式 Template (模板模式)
2011/06/26 PHP
php随机输出名人名言的代码
2012/10/07 PHP
PHP 文件锁与进程锁的使用示例
2017/08/07 PHP
PHP实现字母数字混合验证码功能
2019/07/11 PHP
浅谈php常用的7大框架的优缺点
2020/07/20 PHP
多浏览器支持的右下角浮动窗口
2010/04/01 Javascript
在JavaScript中获取请求的URL参数
2010/12/22 Javascript
关于setInterval、setTimeout在jQuery中的使用注意事项
2011/09/28 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
JS截取字符串常用方法整理及使用示例
2013/10/18 Javascript
改变文件域的样式实现思路同时兼容ie、firefox
2013/10/23 Javascript
回车直接实现点击某按钮的效果即触发单击事件
2014/02/27 Javascript
js实现简洁的滑动门菜单(选项卡)效果代码
2015/09/04 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
Bootstrap打造一个左侧折叠菜单的系统模板(二)
2016/05/17 Javascript
详解js中常规日期格式处理、月历渲染和倒计时函数
2016/12/28 Javascript
jQuery实现对象转为url参数的方法
2017/01/11 Javascript
Ajax实现不刷新取最新商品
2017/03/01 Javascript
在 Node.js 中使用 async 函数的方法
2017/11/17 Javascript
详解JS实现简单的时分秒倒计时代码
2019/04/25 Javascript
vue实现购物车结算功能
2020/06/18 Javascript
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
python邮件发送smtplib使用详解
2020/06/16 Python
python实现控制台打印的方法
2019/01/12 Python
python同步两个文件夹下的内容
2019/08/29 Python
Pycharm 安装 idea VIM插件的图文教程详解
2020/02/21 Python
原生canvas制作画图小工具的踩坑和爬坑
2020/06/09 HTML / CSS
暇步士官网:Hush Puppies
2016/09/22 全球购物
Speedo速比涛中国官方网站:全球领先泳装运动品牌
2018/04/24 全球购物
HEMA英国:荷兰原创设计
2018/08/28 全球购物
英国的一家创新礼品和小工具零售商:Menkind
2019/08/24 全球购物
DBA的职责都有哪些
2012/05/16 面试题
新闻编辑自荐书范文
2014/02/12 职场文书
感恩的演讲稿
2014/05/06 职场文书
教师师德考核自我评价
2014/09/13 职场文书
vue 实现上传组件
2021/05/31 Vue.js