微信小程序开发摇一摇功能


Posted in Javascript onNovember 22, 2019

微信小程序摇一摇

方法定义: 

let shakeInfo = {
 openFlag: false,// 是否开启摇一摇,*****注意:如果是小程序全局监听摇一摇,这里默认为true
 shakeSpeed: 110,//设置阈值,越小越灵敏
 shakeStep: 2000,//摇一摇成功后间隔
 lastTime: 0,//此变量用来记录上次摇动的时间
 x: 0,
 y: 0,
 z: 0,
 lastX: 0,
 lastY: 0,
 lastZ: 0, //此组变量分别记录对应 x、y、z 三轴的数值和上次的数值
};
function openShakeEvent() {
 shakeInfo.openFlag = true;
}
function closeShakeEvent() {
 shakeInfo.openFlag = false;
}
function shakeOk() {
 closeShakeEvent();
 setTimeout(function () {
  openShakeEvent();
 }, shakeInfo.shakeStep);
}
/**
 * 判断是否为摇一摇
 */
function shake(acceleration, successCallback) {
 if (!shakeInfo.openFlag) {
  return;
 }
 var nowTime = new Date().getTime(); //记录当前时间
 //如果这次摇的时间距离上次摇的时间有一定间隔 才执行
 if (nowTime - shakeInfo.lastTime > 100) {
  var diffTime = nowTime - shakeInfo.lastTime; //记录时间段
  shakeInfo.lastTime = nowTime; //记录本次摇动时间,为下次计算摇动时间做准备
  shakeInfo.x = acceleration.x; //获取 x 轴数值,x 轴为垂直于北轴,向东为正
  shakeInfo.y = acceleration.y; //获取 y 轴数值,y 轴向正北为正
  shakeInfo.z = acceleration.z; //获取 z 轴数值,z 轴垂直于地面,向上为正
  //计算 公式的意思是 单位时间内运动的路程,即为我们想要的速度
  var speed = Math.abs(shakeInfo.x + shakeInfo.y + shakeInfo.z - shakeInfo.lastX - shakeInfo.lastY - shakeInfo.lastZ) / diffTime * 10000;
  //console.log(speed)
  if (speed > shakeInfo.shakeSpeed) { //如果计算出来的速度超过了阈值,那么就算作用户成功摇一摇
   successCallback();
  }
  shakeInfo.lastX = shakeInfo.x; //赋值,为下一次计算做准备
  shakeInfo.lastY = shakeInfo.y; //赋值,为下一次计算做准备
  shakeInfo.lastZ = shakeInfo.z; //赋值,为下一次计算做准备
 }
}

方法调用,在小程序启动首页页面onLoad添加如下代码:

/**
  * 生命周期函数--监听页面加载
  */
 onLoad: function(options) {
  //
  wx.onAccelerometerChange(function(acceleration) {
   Main.shake(acceleration, function() {
    Main.shakeOk();
    Main.openBarCodeDlg(); // 在这里调用摇一摇成功后执行的代码
   });
  });
 }

如果是小程序全局都监听摇一摇,以上代码就可以实现,如果只是配置指定某几个页面监听,则需要在监听的页面做以下code:

onShow: function() {
 Main.openShakeEvent();
},
onHide: function() {
 Main.closeShakeEvent();
}

这样在跳转到非监听页面时就不会执行你的代码了

补充:下面看下微信小程序 实现摇一摇重力感应API

微信小程序并没有提供摇一摇API接口,但是提供了一个重力感应的API 「wx.onAccelerometerChange(CALLBACK)」,我们可以用这个方法来模拟微信摇一摇功能,代码如下:

Page({
  onShow: function () {
    wx.onAccelerometerChange(function (e) {
      console.log(e.x)
      console.log(e.y)
      console.log(e.z)
      if (e.x > 1 && e.y > 1) {
        wx.showToast({
          title: '摇一摇成功',
          icon: 'success',
          duration: 2000
        })
      }
    })
  },
  onHide: function(){
    
  }
})

但如果小程序需要启用tabbar的话,这样启用重力感应API会使tabbar下面所有页面都会监听到重力感应数据,导致模拟摇一摇在所有页面都能出现摇一摇的结果,这并不是我们想要的,我们只是想在tabbar下其中一个页面允许他获取到重力感应数据,那么就需要我们自己加入一个是否在当前页面的判断,根据判断结果来启用监听重力感应API,代码修改如下:

Page({
  isShow: false,
  onShow: function () {
    var that = this;
    this.isShow = true;
    wx.onAccelerometerChange(function (e) {
      if(!that.isShow){
        return
      }
      console.log(e.x)
      console.log(e.y)
      console.log(e.z)
      if (e.x > 1 && e.y > 1) {
        wx.showToast({
          title: '摇一摇成功',
          icon: 'success',
          duration: 2000
        })
      }
    })
  },
  onHide: function(){
    this.isShow = false;
  }
})

总结

以上所述是小编给大家介绍的微信小程序开发摇一摇功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
JavaScript 面向对象的之私有成员和公开成员
May 04 Javascript
基于jquery的返回顶部效果(兼容IE6)
Jan 17 Javascript
解析Jquery取得iframe中元素的几种方法
Jul 04 Javascript
JavaScript实战之带收放动画效果的导航菜单
Aug 16 Javascript
如何使用headjs来管理和异步加载js
Nov 29 Javascript
浅析Jquery操作select
Dec 13 Javascript
react开发中如何使用require.ensure加载es6风格的组件
May 09 Javascript
前端构建工具之gulp的语法教程
Jun 12 Javascript
利用ECharts.js画K线图的方法示例
Jan 10 Javascript
浅谈angularJS2中的界面跳转方法
Aug 31 Javascript
jquery弹窗时禁止body滚动条滚动的例子
Sep 21 jQuery
关于vue的列表图片选中打钩操作
Sep 09 Javascript
js实现录音上传功能
Nov 22 #Javascript
解决vue自定义全局消息框组件问题
Nov 22 #Javascript
JavaScript实现省市联动效果
Nov 22 #Javascript
Vue混入mixins滚动触底的方法
Nov 22 #Javascript
超简单的微信小程序轮播图
Nov 22 #Javascript
微信小程序实现Swiper轮播图效果
Nov 22 #Javascript
Js代码中的span拼接问题解决
Nov 22 #Javascript
You might like
php 时间计算问题小结
2009/01/04 PHP
PHP面向对象之后期静态绑定功能介绍
2015/05/18 PHP
Phpstorm+Xdebug断点调试PHP的方法
2018/05/14 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
javascript 有趣而诡异的数组
2009/04/06 Javascript
Jqyery中同等与js中windows.onload的应用
2011/05/10 Javascript
JSON+JavaScript处理JSON的简单例子
2013/03/20 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
详谈JavaScript 匿名函数及闭包
2014/11/14 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
一个超简单的jQuery回调函数例子(分享)
2016/08/08 Javascript
js实现常用排序算法
2016/08/09 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
jQuery使用animate实现ul列表项相互飘动效果示例
2016/09/16 Javascript
js+div+css下拉导航菜单完整代码分享
2016/12/28 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
Vue.js与 ASP.NET Core 服务端渲染功能整合
2017/11/16 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
详解JavaScript 中 if / if...else...替换方式
2018/07/15 Javascript
原生js实现移动端Touch轮播图的方法步骤
2019/01/03 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
[43:41]VP vs RNG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.21.mp4
2020/07/19 DOTA
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
python pygame实现五子棋小游戏
2020/10/26 Python
python 动态渲染 mysql 配置文件的示例
2020/11/20 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
英智兴达软件测试笔试题
2016/10/12 面试题
安全在我心中演讲稿
2014/09/01 职场文书
家庭财产分割协议书范本
2014/11/24 职场文书
风雨哈佛路观后感
2015/06/03 职场文书